我有一个 Ruby on Rails 3.2.13 应用程序,其中有一个 collection_select 语句。collection_select 语句在 fields_for 语句中,我从 collection_select 收集选定的 id 并使用它们填充另一个表。我遇到的问题是 collection_select 语句在存储所选 id 集合的数组中添加了一个空 id 条目。
在我看来,这是我的代码:
<%= f.fields_for :media_topics do |media_topic| %>
<%= media_topic.label :topic, "Topics" %><%= media_topic.collection_select(:topic_id, Topic.order("name_en"), :id, :name_en, {}, {multiple: true}) %>
<% end %>
以下是选择两个选项后数组外观的示例:
"media_topics_attributes"=>{"0"=>{"topic_id"=>["", "2", "47"], "id"=>"1895"}}
我通过另一个 Stack Overflow 成员发现,collection_select 中的空白条目是一个隐藏值,它会自动包含在内。在 Rails 3 中,没有办法不包含该字段。但是,根据我之前的问题Rails 3.2 - collection_select 在我的数组的第一个位置添加空条目中提供的链接,将有一种方法可以在 Rails 4 中排除这个隐藏值。
在我决定第一次使用 Accepts_nested_attributes_for 之前,我跳过了这个值并手动添加了 MediaTopic 行。我想让我的控制器代码比现在更干净。我遇到的问题是弄清楚如何跳过那个空白条目。我已经阅读了 API 和许多其他关于我应该如何跳过这个值的帖子,但它们都没有工作。
这是我的 MediaLibrary 模型中的 media_topics 嵌套属性的代码。
has_many :media_topics, dependent: :destroy
accepts_nested_attributes_for :media_topics, allow_destroy: true, reject_if: proc { |attributes| attributes['id'].blank? }
collection_select 中的主题模型具有字段:id将更新模型 MediaTopic 中的字段: topic_id。MediaTopic 中的另一个字段是:media_library_id。我在 Accept_nested_attributes_for 命令中尝试了字段id和topic_id,但是当我为主模型执行 update_attributes 时,我收到一条错误消息,指出主题不能为空。我确定错误来自尝试为数组中的第一个空白条目创建 MediaTopic 行。
我已经研究了几天,但我没有尝试过任何工作。我检查了 API、APIDock 和其他来源无济于事。我想在执行 update_attributes 之前从 media_topics_attributes 中删除空白条目。我想我不明白如何编写代码。我已经在 API 中看到了这个作为一个例子,但我不知道应该去哪里或者我应该如何编码来摆脱空白值。
params = { member: {
posts_attributes: [{ id: '2', _destroy: '1' }]
}}
任何帮助,将不胜感激。
更新 2013 年 8 月 10 日晚上 10:46 CDT
在我的控制器中,在完成所有错误检查后,我的 case 语句中有以下 when 子句。
when @media_library.update_attributes(params[:media_library])
更新 2013 年 8 月 12 日上午 8:20 CDT
在 MediaLibrary 模型中,我将 accept_nested_attributes_for 更改为以下内容。
accepts_nested_attributes_for :media_topics, allow_destroy: true
更新 2013 年 8 月 12 日上午 10:50 CDT
这是我的调试中哈希的样子:
media_topics_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
'0': !ruby/hash:ActiveSupport::HashWithIndifferentAccess
topic_id:
- '2'
- '47'
id: '1896'
但是我仍然收到错误Media topics topic can't be blank。我会继续寻找。
更新 2013 年 8 月 12 日下午 12:15 CDT
主题是具有名称列表的模型(:id,:name)
MediaLibrary 是我希望能够通过 Topic.name 选择的行列表
MediaTopic 是将 Topic 与 MediaLibrary 相关联的行列表
MediaLibrary has_many :media_topics, 依赖: :destroy
主题 has_many :media_topics
MediaTopic 属于_to :media_library 属于_to :topic
我正在处理的屏幕将对 MediaLibrary 进行更改,并根据列出主题名称的 collection_select 语句更新 MediaTopic。