【问题标题】:Rails 4 - checkboxes for has_and_belongs_to_many associationRails 4 - has_and_belongs_to_many 关联的复选框
【发布时间】:2014-02-10 21:22:10
【问题描述】:

我最近在 Rails 4 中让复选框为 has_and_belongs_to_many (HABTM) 关联工作时遇到了问题。我能够找到有关如何使其在几个不同的地方正常工作的信息,但认为最好在 StackOverflow 上的一个地方记录使其正常工作所需的几个简单步骤。

作为一个设置,假​​设一个犬舍模型与一个 HABTM 关联到 Handler。

class Kennel
    has_and_belongs_to_many :handlers
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    这就是你需要为表单做的所有事情:当有内置帮助器时,不要手动执行。

    <%= form_for @kennel do |f| %>
      <%= f.collection_check_boxes(:handler_ids, Handler.all, :id, :to_s) %>
    <% end %>
    

    【讨论】:

    • 你确定这不是在使用 simple_form gem吗?这就是我的样子。 @jpduffy
    • 如果使用强参数,请务必添加它(如其他答案所示)params.require(:kennel).permit({handler_ids: []})
    • 我知道 OP 指定 Rails 4,但仅供参考,这个 collection_check_boxes 方法仅在 Rails 4+ 中可用。
    【解决方案2】:

    表单应该是这样的:

    <%= form_for(@kennel) do |form| %>
        ...
        <div class="field">
            <div class="field_head">Handlers</div>
            <%= hidden_field_tag("kennel[handler_ids][]", nil) %>
            <% Handler.order(:name).each do |handler| %>
                <label><%= check_box_tag("kennel[handler_ids][]", id, id.in?(@kennel.handlers.collect(&:id))) %> <%= handler.name %></label>
            <% end %>
        </div>
        ...
    <% end %>
    

    hidden_​​field_tag 允许用户取消选中所有框并成功删除所有关联。

    控制器需要通过 allowed_pa​​rams 方法中的强参数来允许参数:

    params.permit(kennel: [:city, :state
        {handler_ids: []},
        :description, ...
        ])
    

    参考文献

    【讨论】:

      【解决方案3】:

      我以这种方式实现 has_and_belongs_to_many 关联:

      模特/角色

      class Role < ActiveRecord::Base
        has_and_belongs_to_many :users
      end
      

      模型/用户

      class User < ActiveRecord::Base
        has_and_belongs_to_many :roles
      end
      

      users/_form.html.erb

      ---
      ----
      -----
       <div class="field">
              <% for role in Role.all %>
                  <div>
                      <%= check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role) %>
                      <%= role.name %>
                  </div>
              <% end %>
          </div>
      

      users_controller.rb

      def user_params
          params.require(:user).permit(:name, :email, { role_ids:[] })
        end
      

      中间table_name应该是roles_users并且应该有两个字段:

      1. role_id
      2. user_id

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多