在我的Rails应用程序中,我有用户,角色和权限。
创建/编辑角色时,您可以通过选中其复选框来选择启用哪些权限,该复选框会将权限保存在名为' roles_permissions'的表中。 (基本上允许的权限存储在连接表中)。
所以我的编辑角色方法如下:
def edit
@role = Role.find(params[:id])
@permissions_by_controller = Permission.order('controller asc').group_by(&:controller)
end
和更新方法(补丁):
def update
@role = Role.find(params[:id])
if @role.update_attributes(role_params)
redirect_to roles_path, :notice => 'Article updated!'
else
render 'edit'
end
end
和params:
def role_params
params.require(:role).permit(:name, permission_ids: [])
end
在编辑视图中,我有一个如下的复选框:
<%= check_box_tag "role[permission_ids][]", permission.id, @role.permissions.include?(permission), :id => permission.id, :class => 'switch__checkbox' %>
当我勾选复选框并保存时,此功能正常。
但是,当我取消选中复选框并保存时,它不会删除权限...大概是因为没有传回任何参数。我该如何解决这个问题?
关联设置为:
class Role < ActiveRecord::Base
has_and_belongs_to_many :users, :join_table => 'users_roles'
has_and_belongs_to_many :permissions, :join_table => 'roles_permissions'
end
class Permission < ActiveRecord::Base
has_and_belongs_to_many :roles, :join_table => 'roles_permissions'
end
注意:我还注意到,无法以与使用复选框相同的方式从用户中删除角色。
答案 0 :(得分:2)
一个经典问题。 f.check_box
为您解决此问题,取消选中时返回false
,但check_box_tag
没有。{/ 1>
您可以使用隐藏字段在标记之前使用空值来解决它。
<%= hidden_field_tag "role[permission_ids][]", '' %>
<%= check_box_tag "role[permission_ids][]", permission.id...
当没有选择任何内容时,表单知道填充空值字段。 (如果你更清楚,你也可以放'false'
而不是空字符串。)
答案 1 :(得分:0)
补充钢铁的答案(并且由于我无法代表他的代表回答他的答案) 我会和任何寻求不同方法来解决此问题的人说。
我更喜欢将hidden_field附加到表单上。
<%= form.hidden_field :permission_ids, { multiple: true, value: '' } %>
由于我们正在调用form.hidden_field
,所以名称和ID将已经包含role
,并且它将添加permissions_ids
作为内部角色的关键。
多个将添加所需的方括号。
生成的html标签将为:
<input multiple="multiple" value="" type="hidden" name="role[permission_ids][]" id="role_permission_ids">