Я следую за вики 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
Спасибо! Я добавил коды в пользовательскую модель. Я после добавления ролей: [] значение поля role_mask может быть сохранено, но поле роли по-прежнему равно нулю. Есть ли что-то еще не правильное? –
Вам не нужно добавлять столбец 'role' в базу данных. Только «role_mask» выполнит эту работу. Теперь просто попробуйте «user.roles», он должен вернуть вам роли. – Deep
Это работает! Если честно. Я не понимаю, почему я добавил поле role_mask, но мне нужно поставить роли: [] внутри сильного параметра и как он генерирует роли: []. Не могли бы вы дать мне знать, как происходит магия или куда я могу научиться? –