我目前正在处理一个表单来编辑用户的信息,表单的一部分是检查其所扮演的角色。
角色存储在自己的表中,该表具有角色类型和用户的ID。
我要做的是选中这三种角色的复选框,用户可以检查他们应该拥有的角色。
基本上,表单应如下所示:
问题是我不知道如何使用表单构建器进行设置。我为用户设置了accepts_nested_attributes_for :roles
,但不确定fields_for
的工作方式。
有什么想法吗?
答案 0 :(得分:0)
您不需要嵌套属性即可简单地将关联分配给记录。
首先,您要更改表和关联以创建规范化表:
class User < ApplicationRecord
has_many :user_roles, dependent: :destroy
has_many :roles, through: :user_roles
end
# remove user_id from the roles table
class Role < ApplicationRecord
validates_uniqueness_of :name
has_many :user_roles, dependent: :destroy
has_many :users, through: :user_roles
end
# rails g model user_role user:references role:references
class UserRole < ApplicationRecord
validates_uniqueness_of :role_id, scope: :user_id
belongs_to :user
belongs_to :role
end
这意味着角色的定义name
在roles
表中仅定义一次,而不是为应用于用户的每个角色重复。要将角色分配给用户,您只需在连接表中添加一个角色ID和用户ID,即可更有效地对其进行索引。
由于我们不需要为每个用户角色设置重复的名称列,因此我们可以使用role_ids=
来设置复选框的用户角色。
<%= form_for(@user) do |f| %>
<%= f.collection_check_boxes(:role_ids, Role.all, :id, :name) %>
...
<% end %>
class UsersController < ApplicationController
# ...
def create
@user = User.new(user_params)
# ...
end
# ...
private
def user_params
params.require(:user)
.permit(:foo, :bar, role_ids: [])
end
end
答案 1 :(得分:-1)
https://guides.rubyonrails.org/form_helpers.html#nested-forms
给出的示例是:
<%= form_for @person do |f| %>
Addresses:
<ul>
<%= f.fields_for :addresses do |addresses_form| %>
<li>
<%= addresses_form.label :kind %>
<%= addresses_form.text_field :kind %>
<%= addresses_form.label :street %>
<%= addresses_form.text_field :street %>
...
</li>
<% end %>
</ul>
<% end %>
要适应这一点,我假设您已经设置了模型:
<%= form_for @user do |f| %>
<%= f.input :first_name %>
<%= f.input :last_name %>
Role:
<ul>
<%= f.fields_for :roles do |role_f| %>
<li>
<%= role_f.check_box :it %>
<%= role_f.check_box :accounting %>
<%= role_f.check_box :sales%>
</li>
<% end %>
</ul>
<% end %>
从那里您可以看到参数如何通过并根据需要创建角色