0

我有一个 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 命令中尝试了字段idtopic_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。

4

2 回答 2

0

在 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
于 2013-08-11T00:01:40.070 回答
0

根据@vinodadhikary 的说法,数组中的 null 条目在 Rails 3 中按预期工作。我最近在 Rails 4 中重写了这个应用程序。我完全重写了逻辑,首先使用 has_many 来关联我的所有表。我还仅使用 collection_select 语句替换了 fields_for 逻辑。我在第一个 {} 中添加了 include_hidden = false ,并且数组中没有出现空条目。几天前我问了一个类似的问题,经过大量搜索后,我想出了一个解决方案。详细信息在下面的链接中。

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

于 2013-11-13T22:33:13.310 回答