5

我有表User和表Categories

这两个表之间的关系:

  • 用户has_many :categories
  • 类别belongs_to :user

我想在用户的(标准)编辑页面上显示带有复选框的类别列表。当该用户选中某些复选框时,我想保存它们,然后在他下次打开页面时显示为选中状态。

但是如何在视图中渲染复选框呢?以及如何存储有关用户在数据库中检查的复选框的信息?我的第一个想法是使用and创建一个类似user_categories的表,但不确定这种方法的效果如何。user_idcategory_id

如今,执行此任务的最佳方法是什么?

4

3 回答 3

3

除了引入强参数外,最近没有太大变化。您仍然想使用 a has_and_belongs_to_manyorhas_many :through关系,然后直接分配关系的 id。您需要设置一个表单来传递一组被选中的 id,以便它们像{user: {category_ids => [1,2,3]}.

class User < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

在控制器中

def update
  current_user.update(user_params)
end

def user_params
  params[:user].permit(
    {:category_ids => []}
  )
end
于 2013-10-28T12:16:54.960 回答
2

您可以采用 habtm 方法。

然后在部分用户表单中,添加字段

 <div class="field"> 
   <%= f.label "Categories" %><br /> 
   <% for category in Category.all %> 
   <%= check_box_tag 'user[category_ids][]', category.id, 
  @user.category_ids.include?(category.id), :id => dom_id(category) %> 
   <%= label_tag dom_id(category), category.name, :class => "check_box_label" %> 
   <% end %> 
 </div>

其中 category.name 是您的类别模型中的字段。

这应该有效。

然后在您的用户索引视图中,

<% @users.each do |user| %>
<%= user.categories.collect(&:name).join(",") %>
<% end %>

它应该显示用户的相关类别。不要忘记在您的用户模型 attr_accessible 字段中添加 :category_ids。否则会弹出大量评估安全性

于 2013-10-28T13:34:02.673 回答
1

您可能希望使用而不是让类别属于一个用户来实现多对多关系has_many :through(意味着一个类别只能有一个用户,这是您想要的吗?

阅读has_many :through以帮助您入门。完成后,可以使用collection_check_boxes帮助器轻松实现复选框。

于 2013-10-28T12:13:56.370 回答