所以我有这种关联:
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
数组?
我将感激所有信息。谢谢!
答案 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}}