2016-12-08 2 views
0

Я следую за вики CanCan, чтобы выполнить мою авторизацию. https://github.com/ryanb/cancan/wiki/Role-Based-Authorization

Я делал каждый шаг, как говорит вики. Я не могу сохранить поля значений «role» и «role_mask», каждый раз, когда я отправляю форму, они равны нулю. Кто-нибудь может сказать мне, как это исправить?

схемы пользователяRails: CanCan много ролей на одного пользователя не может сохранить значение флажка

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 

ответ

1

В 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 

Они также необходимы для сохранения роли.

+0

Спасибо! Я добавил коды в пользовательскую модель. Я после добавления ролей: [] значение поля role_mask может быть сохранено, но поле роли по-прежнему равно нулю. Есть ли что-то еще не правильное? –

+0

Вам не нужно добавлять столбец 'role' в базу данных. Только «role_mask» выполнит эту работу. Теперь просто попробуйте «user.roles», он должен вернуть вам роли. – Deep

+0

Это работает! Если честно. Я не понимаю, почему я добавил поле role_mask, но мне нужно поставить роли: [] внутри сильного параметра и как он генерирует роли: []. Не могли бы вы дать мне знать, как происходит магия или куда я могу научиться? –

Смежные вопросы