【问题标题】:How to add multiple many-to-many fields in one form with Rails 4?如何使用 Rails 4 在一个表单中添加多个多对多字段?
【发布时间】:2014-05-22 18:38:44
【问题描述】:

我有一个具有以下关联的表单:

课程.rb

has_and_belongs_to_many :skills

技能.rb

has_and_belongs_to_many :courses

我想做的是让想要添加新Course 的人从他选择的类别中选择所有技能,并能够通过使用复选框来添加它们。在我这样做的视图中:

查看

<%= form_for(@course) do |f| %>
  <% @skills.each do |s| %>
    <%= f.check_box :value => s.id %> <%= s.title %><br />
  <% end %>
<% end %>

很遗憾,这不起作用,我收到以下错误:

undefined method `{:value=>9}' for #<Course:0x00000004ce0208>

您能帮我解决我的问题吗?

谢谢。

【问题讨论】:

  • 试试这样&lt;%= check_box_tag "course[skill_ids][]", s.id, current_skill_ids.include?(s.id) %&gt;
  • 在此之前,您将其设置为这样&lt;% current_skill_ids = @course.skill_ids %&gt;
  • 这让我明白了,谢谢。但是它们没有保存在courses_skills 表中,您知道什么可以阻止它们吗?

标签: ruby-on-rails ruby forms has-and-belongs-to-many


【解决方案1】:

Rails 4 中,现在有一个很棒的 collection_check_boxes 表单辅助方法。

来自Rails API docs

<%= form_for @post do |f| %>
  <%= f.collection_check_boxes :author_ids, Author.all, :id, :name_with_initial %>
  <%= f.submit %>
<% end %>

在您的设置中,可能是这样的:

<%= form_for @course do |f| %>
  <%= f.collection_check_boxes :skill_ids, Skill.all, :id, :name %>
  <%= f.submit %>
<% end %>

collection_check_boxes 最酷的地方在于它可以选择 [占用一个块]( http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-collection_check_boxes) 让您自定义生成的标记(例如用于样式目的):

collection_check_boxes(:post, :author_ids, Author.all, :id, :name_with_initial) do |b|
  b.label(:"data-value" => b.value) { b.check_box + b.text }
end

【讨论】:

    【解决方案2】:

    我认为你应该使用这个代码:

    适用于 Rails 3.*

    <%= check_box_tag "course[skill_ids][]", s.id, s.title %>
    

    适用于 Rails 4.* 正如评论中提到的,Rails 4 引入了collection_check_boxes,因此您的代码可能如下所示:

    <%= collection_check_boxes(:course, :skill_ids, Skills.all, :id, :title) %>
    

    查看 check_box_tag 的文档:http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html#method-i-check_box_tag

    如何在 Rails 中处理 HABTM 我推荐这个Railscast,或者代码可用here

    【讨论】:

    • 这是在 Rails 3 中手动构建集合复选框的好方法。在 Rails 4 中,引入了一个新的collection_check_boxes 表单助手来完成此操作。想你可能会喜欢 :)
    • 我不知道!谢谢你让我知道!太好了。
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多