check_box表单助手的正确用法是什么?

时间:2012-10-08 06:20:27

标签: ruby-on-rails ruby-on-rails-3

我有两个型号 - Client& Topic,它们之间有HABTM关系。

我正在尝试在客户端form部分上生成一系列主题的复选框。

这就是我在做的事情:

<% Topic.all.each do |topic| %>
  <% checked = @client.topics.include?(topic) %>
    <%= f.label(:name, topic.name) %> <%= f.check_box @topics, topic.id %>
<% end %>

这是我得到的错误:

undefined method `merge' for 1:Fixnum

我知道一个解决方案是使用check_box_tag,但这迫使我手动更新关联记录。

所以我宁愿使用form_helper作为checkbox标签。 The docs对我来说有点混乱。

如何使用此f.check_box

感谢。

2 个答案:

答案 0 :(得分:0)

代码让我困惑。 @topics包含哪些内容?如果它是Topic的集合,那么为什么您在视图中直接访问Topic模型?它将是:

@topics.each.do

而不是你

Topic.all.each

此外,您在循环中使用@topics作为集合。 check_box如何从集合中生成复选框?

请查看以下内容:

  1. accepts_nested_attributes_for。除了客户端has_many主题关联
  2. 之外,您还需要在客户端模型中进行设置
  3. fields_for否则,rails将不知道您要从同一表单更新主题模型。
  4. 检查this screencasts以了解如何使其正常工作

答案 1 :(得分:0)

无论出于何种原因,form帮助程序都无法与check_box一起使用。

所以,这是有效的代码:

<%= check_box_tag "client[topic_ids][]", topic.id, checked %>

根据other answers的类似问题,帮助器f.check_box是模型绑定的,并且提供给复选框的值是隐含在表单上的模型中的。问题是,我无法弄清楚如何获取form_helper的隐含值来生成正确的标记 - 即client[topic_ids][],所以我不得不诉诸check_box_tag