如果未选中复选框,则从表中删除

时间:2016-11-18 16:10:23

标签: ruby-on-rails

在我的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

注意:我还注意到,无法以与使用复选框相同的方式从用户中删除角色。

2 个答案:

答案 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">