我有一个RubyonRails 3.2.13应用程序,其中有一个collection_select语句。collection_select语句位于fields_for语句中,我从collection_seelect中收集选定的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中的空白项是一个隐藏值,它会自动包含在内。在Rails3中,不可能不包含该字段。然而,根据我之前的问题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中的Topic模型具有字段:id,该字段将更新模型MediaTopic中的字段:Topic_id。MediaTopic中的另一个字段是:media_library_id。我尝试过accepts_nested_attributes_for命令中的字段id和topic_id,但当我为主模型执行update_attributes时,我会收到一个错误,说主题不能为空。我确信错误来自于试图为数组中的第一个空白条目创建MediaTopic行。
我已经研究了好几天了,但我没有尝试过任何作品。我已经检查了API、APIDock和其他来源,但没有结果。在更新attributes之前,我想从media_topics_attributes中删除空白条目。我想我不知道如何写代码。我在API中看到了这个例子,但我不知道它应该去哪里,也不知道我应该如何编码它以摆脱空白值。
params = { member: {
posts_attributes: [{ id: '2', _destroy: '1' }]
}}
如有任何帮助,我们将不胜感激。
更新日期2013年10月8日上午10:46 CDT
在我的控制器中,在所有错误检查完成后,我的case语句中有以下when子句。
when @media_library.update_attributes(params[:media_library])
更新日期2013年8月12日上午8:20
在MediaLibrary模型中,我将accepts_nested_attributes_for更改为以下内容。
accepts_nested_attributes_for :media_topics, allow_destroy: true
更新日期2013年8月12日上午10:50
以下是我调试中的散列:
media_topics_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
'0': !ruby/hash:ActiveSupport::HashWithIndifferentAccess
topic_id:
- '2'
- '47'
id: '1896'
但是,我仍然收到错误媒体主题主题不能为空。我会继续找的。
更新日期2013年12月8日下午12:15 CDT
Topic是一个带有名称列表(:id,:name)的模型
MediaLibrary是我希望能够通过Topic.name 选择的行的列表
MediaTopic是将Topic与MediaLibrary 相关的行列表
MediaLibrary有_many:media_topics,dependent::destroy
主题has_many:media_topics
媒体主题belongs_to:media_library belongs_to:主题
我正在处理的屏幕将根据列出主题名称的collection_select语句更改MediaLibrary并更新MediaTopic。
在MediaLibrary模型中
alias_method :underlying_media_topics_attributes=, :media_topics_attributes=
def media_topics_attributes=(hash_of_hashes)
hash_of_hashes.each { |key, hash| hash[:topic_id].reject!(&:blank?) }
self.underlying_media_topics_attributes=(hash_of_hashes)
end
根据@vinodadhikary的说法,数组中的null条目在Rails 3中正常工作。我最近在Rails4中重写了这个应用程序。我完全重写了逻辑,首先使用has_many到关联我的所有表。我还使用collection_select语句替换了fields_for逻辑。我在第一个{}中添加了include_hidden=false,null条目不会出现在数组中。几天前我问了一个类似的问题,经过大量的搜索,我找到了一个解决方案。详细信息请参阅下面的链接。
Rails 4-使用collection_select为具有嵌套属性的中间表获取id数组