Rails 4 - 使用 collection_select 获取具有嵌套属性的中间表的 id 数组



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

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

以下是我的模型定义。

media_library.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 - 从嵌套属性中删除条目中尝试了类似的事情。 当我在 Rails 3 中尝试此操作时,collection_select只显示一个突出显示多行的列表。 由于空白数组条目存在问题,我决定继续执行更新中间表的手动过程。

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

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

任何帮助将不胜感激。

经过更多的检查,我能够找到解决方案。 我实现了类似于我在 Rails 上读到的东西 has_many :through 和 collection_select 与 multi

media_library.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选择了下拉列表中的行。 我正在手动删除并从params[:media_library][:page_title_ids]中添加媒体页面行。

相关内容

  • 没有找到相关文章

最新更新