【问题标题】:Rails 3 has_and_belongs_to_many creates checkboxes in viewRails 3 has_and_belongs_to_many 在视图中创建复选框
【发布时间】:2010-09-22 09:42:02
【问题描述】:

基于以下模型

class Company < ActiveRecord::Base
  has_and_belongs_to_many :origins
end

class Origin < ActiveRecord::Base
  has_and_belongs_to_many :companies
end

我想在我的companies/_form 中有一组代表所有来源的复选框。

不知道companies_controller#create中的Company.new(params[:company])能否创建公司与所选来源的关联?

我正在运行 rails 3.0.0,实现这一目标的最佳方法是什么?

感谢您的见解

【问题讨论】:

    标签: ruby-on-rails associations


    【解决方案1】:

    如今,habtm 并不是一个流行的选择,最好使用 has_many :through 代替,并在两者之间使用适当的连接模型。这将为您提供 Company#origin_ids= 方法,您可以将原始 ID 数组从表单传递给该方法,以设置 @company 的所有关联来源。例如

    <% current_origin_ids = @company.origin_ids %>
    <% form_for @company do |f| %>
      <label>Name:<%= f.text_field :name %></label>
      <% Origin.all.each do |origin| %>
        <label><%= origin.name %>
          <%= check_box_tag "company[origin_ids][]", origin.id, current_origin_ids.include?(origin.id) %>
        </label>
      <% end %>
    <% end %>
    

    顺便说一句,使用适当的连接模型和相应的控制器,您可以使用 AJAX 轻松添加/删除源,使用对连接模型的控制器的创建/删除调用。

    【讨论】:

    • 您可能想要添加一个隐藏字段标签,否则如果您取消选中所有标签,它将无法工作。 hidden_​​field_tag '公司[origin_ids][]',[]
    【解决方案2】:

    我必须同意@carpeliam,has_many :through 不应该是默认选择。 HABTM 工作正常,涉及的代码更少。它也不限制 ajax 的使用,并且确实公开了一个 origin_ids 设置器,您可以向其传递一个 id 数组。因此,screencast 从 2007 年开始仍然适用于 Rails 3。如果使用 simple_form,另一个选项是:

    = form.association :origins, :as => :check_boxes
    

    【讨论】:

      【解决方案3】:

      就我个人而言,我并不认为多次通过总是更好,这实际上取决于您的情况。如果您的连接模型本身具有属性的任何可能性,则具有多通性会更好。改变起来更灵活。它消除了一些 Rails 约定的魔力。但是,如果您不需要 has-many-through,那么 HABTM checkboxes 的旧 RailsCast 可能会派上用场。

      【讨论】:

        猜你喜欢
        • 2018-08-01
        • 1970-01-01
        • 2012-01-14
        • 2016-04-11
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多