1

我想重写手动逻辑以更新表以使用嵌套属性,同时使用第三个表选择多个 id 值。这是我第一次尝试这个。

我有一个 MediaLibrary 模型。我有一个包含名称的 PageTitle 模型。我有一个 MediaPage 模型,其中包含 MediaLibrary 和 PageTitle 的 id 字段。我想使用嵌套属性填充 MediaPage。我想为 PageTitle 创建一个 collection_select,它具有填充 page_title_id MediaPage 的值。

这是我的模型定义。

媒体库.rb

has_many :media_pages, dependent: :destroy
accepts_nested_attributes_for :media_pages, allow_destroy: true  

media_page.rb

belongs_to :media_library

validates :media_library_id, presence: true  
validates :page_title_id, presence: true 

page_title.rb

has_many :media_pages

我手动收集值时的原始视图代码如下。

<%= fields_for :media_pages do |media_page| %>
  <%= media_page.label :media_page, "Page Titles" %><%= media_page.collection_select(:page_title_id, PageTitle.order("name"), :id, :name, {}, {multiple: true}) %>
<% end %>

这是我目前的看法:

<%= f.label :media_pages, "Page Titles" %>
<%= f.fields_for :media_pages do |media_page| %>
  <%= media_page.collection_select(:page_title_id, PageTitle.order("name"), :id, :name, {}, {multiple: true}) %>
<% end %>

如果我有多个 MediaPage 行,则视图将为每一行显示一个 collection_select 列表。例如,如果我有两个 MediaPage 行,我将看到一个 collection_select 列表,其中第一个记录的 PageTitle 名称突出显示,第二个 collection_select 列表,第二个记录的 PageTitle 名称突出显示。正如您所看到的,我从第一个 fields_for 语句和第二个更改的唯一内容是(1)将标签移到 fields_for 之外和(2)添加 f。

我在 Rails 3 Rails 3.2.13 - Delete Entry From Nested Attributes中尝试了类似的东西。当我在 Rails 3 中尝试此操作时,collection_select 仅显示一个列表,其中突出显示了多行。由于空白数组条目存在问题,我决定继续手动更新中间表。

我想要的是在我的视图上显示一个 collection_select 列表,其中可以选择多个 PageTitle id 并使用嵌套属性填充 MediaPage 表。如果存在行,我希望突出显示相应的 PageTitle 行。

我一直试图解决这个问题很长一段时间。通过我的研究,我没有发现任何使用单独的表填充嵌套属性的示例。

任何帮助,将不胜感激。

4

1 回答 1

1

经过更多检查后,我找到了解决方案。我实现了类似于我在Rails has_many :through 和 collection_select 上阅读的内容。

媒体库.rb

has_many :page_titles, through: :media_pages
has_many :media_pages, dependent: :destroy
accepts_nested_attributes_for :media_pages, allow_destroy: true

media_page.rb

belongs_to :media_library  
belongs_to :page_title

page_title.rb

has_many :media_pages, dependent: :destroy

我用下面的 collection_select 语句替换了 fields_for。

<%= collection_select(:media_library, :page_title_ids, PageTitle.order("name"), :id, :name, {:selected => @media_library.page_title_ids, include_hidden: false}, {:multiple => true}) %>

现在,我使用 MediaPage 中的 page_title_ids 选择了下拉列表中的行。我正在手动删除和添加 MediaPage 行params[:media_library][:page_title_ids]

于 2013-11-12T15:25:04.573 回答