轨。 Has_many:通过和form_for参数复选框字段

时间:2017-02-20 13:09:48

标签: ruby-on-rails has-many-through

所以我有这种关联:

class FirstModel 
 has_many :merged_models
 has_many :second_models, :through => :merged_models
end

class SecondModel 
 has_many :merged_models
 has_many :first_models, :through => :merged_models
end

class MergedModel 
 belongs_to :first_model
 belongs_to :second_model
end

现在我的问题是理解这个技巧,帮助check_box_tag帮助者从我的表单中传递的集合中识别HTML中的元素:

form_for(first_model) do |f|

  <% SecondModel.all.each do |s| -%>
    <div>
      <%= check_box_tag 'second_model_ids[]', s.id, first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]'-%>
      <%= label_tag :second_model_ids, s.first_name -%>
    </div>
  <% end -%>

我不明白的是:

first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]'

我相信这一点:

first_model.second_models.include?(s)

检查SecondModel的对象ID是否已经在FirstModel的second_model_ids数组中。在这种情况下,我会期待类似if语句的东西 - 如果这个id在那里,那么就这样做,等等。

这部分让我更加困惑:

:name => 'first_model[second_model_ids][]'

:name来自哪里?为什么first_model[second_model_ids][]有两个方括号 - 它们如何在Rails语法中工作?要将此新检查的ID合并到second_model_ids数组?

我将感激所有信息。谢谢!

1 个答案:

答案 0 :(得分:1)

所以check_box_tag有这个签名:

check_box_tag(name, value = "1", checked = false, options = {})

在你的情况下:

check_box_tag 'second_model_ids[]', s.id, first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]'

第一个参数(name)是'second_model_ids []',这将用作标签的id =部分。 复选框的第二个参数(值)是s的id(SecondModel的当前实例)。 第三个参数(选中)是:

first_model.second_models.include?(s)

你的意思是正确的,你不需要'如果'。 include?()返回一个布尔值(就像大多数以问号结尾的Ruby方法)。您可以在irb或rails console中尝试:

[1,2,3].include?(2)
# => true

最后一个选项:

:name => 'first_model[second_model_ids][]'

传入将用作html的选项哈希。在这种情况下,使用key:name的单个哈希值(不要与上面的第一个参数混淆,在html标记中用作id ='...'),这将直接在标记中使用

name='first_model[second_model_ids][]'

这里的语法也是正确的。括号帮助Rails将其解析为使用

的params哈希的正确嵌套
first_model: {foo: 1, bar: 2, second_model: {some: stuff, other: stuff}}