我有用户表和类别表。
这两个表之间的关系:
has_many :categories
belongs_to :user
我想在用户的(标准)编辑页面上显示带有复选框的类别列表。当这个用户检查一些复选框时,我想保存它们,然后在下次打开页面时显示为已选中。
但是如何在视图中呈现复选框?以及如何存储用户在数据库中检查的复选框的信息?
我的第一个想法就是使用user_id
和category_id
创建一个类似 user_categories 的表格,但不确定这种方法的效果如何。
现在实施这项任务的最佳方法是什么?
答案 0 :(得分:3)
除了引入强参数外,最近没有太大变化。您仍然希望使用has_and_belongs_to_many
或has_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
答案 1 :(得分: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_acessible字段中添加:category_ids。否则会弹出质量保证安全
答案 2 :(得分:1)
您可能希望使用has_many :through
实现多对多关系,而不是让类别属于用户(意味着某个类别只能拥有一个用户,这是您想要的吗?
阅读has_many :through以帮助您入门。完成后,可以使用collection_check_boxes帮助程序轻松实现复选框。