Rails: CanCan many roles per user cannot save checkbox value

Rails: CanCan many roles per user can not save checkbox value

我正在关注 CanCan wiki 以进行授权。 https://github.com/ryanb/cancan/wiki/Role-Based-Authorization

我按照维基所说的做了每一步。 我无法保存值字段 'role' 和 'roles_mask',每次我提交表单时,它们都是零。任何人都可以告诉我如何解决它?

用户架构

  create_table "users", force: :cascade do |t|
    t.string   "username",       
    t.string   "password_digest",
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
    t.string   "role"
    t.integer  "roles_mask"
  end

用户控制器

class UsersController < ApplicationController
  def new
    @user = OmsUser.new
  end

  def create
    @user = User.new(user_params)
    if @saved = @user.save
      flash[:success] = "Success"
    end
  end

  private

  def user_params
    params.require(:user).permit(:username, :password, :password_confirmation,:role, :roles_mask)
  end
end

_form.html.erb

<%= form_for @user do |f| %>
  <%= f.text_field :username %>
  <%= f.password_field :password %>
  <%= f.password_field :password_confirmation %>
  <% for role in User::ROLES %>
    <%= check_box_tag "user[roles][#{role}]", role, @user.roles.include?(role), {:name => "user[roles][]"}%>
    <%= label_tag "user_roles_#{role}", role.humanize %><br />
  <% end %>
  <%= hidden_field_tag "user[roles][]", "" %>
  <%= f.submit %>
<%end%>

User.rb

class User < ApplicationRecord
  ROLES = %w[admin user manager]

  def roles=(roles)
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
    end
  end
end

user_params你没有允许roles:

params.require(:user).permit(:username, :password, :password_confirmation, roles: [])

在您的 user 模型中,您是否添加了这些方法:

# in models/user.rb
def roles=(roles)
  self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end

def roles
  ROLES.reject do |r|
    ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
  end
end

这些也是保存角色所必需的。