나는 방법을 알아 냈어. 사용자
# in models/user.rb
ROLES = [:admin, :manager, :general, :custom_role, :another_custome_role, :banned]
사용자에게 여러 역할을 할당하고 비트 마스크를 사용하여 단일 정수 열에 저장할 수 있습니다. 먼저 roles_mask 정수 열을 users 테이블에 추가하십시오.
레일 마이그레이션 add_roles_mask_to_users가 roles_mask 생성 : 정수 레이크 데시벨은 : 당신이 얻고 사용자가 속한 역할 목록을 설정하기위한 사용자 모델에 다음 코드를 추가해야합니다 다음을 마이그레이션 할 수 있습니다. 이렇게하면 역할 배열을 정수 필드로 변환하는 데 필요한 비트 단위 작업이 수행됩니다. 여기
# 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
작은 수정
는 Rolify & 학자와 함께 작동하도록 def roles=(roles)
self.roles_mask = (roles.map { |x| x.to_sym } & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
end
당신이 attr_accessible 추가하는 것을 잊지 마세요, 강력한 매개 변수없이 고안 사용하는 경우 : 당신이 사용자에게 역할을 모델.
당신이 레일 3 응용 프로그램에서 보석으로 하나, strong_parameters으로 고안 사용하는 경우, 또는 내장되어 레일 4로, 컨트롤러에 허용 된 목록에 역할을 추가하는 것을 잊지 말아
class ApplicationController < ActionController::Base
before_filter :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:email, :password, :password_confirmation, roles: [])}
end
end
Devise 설명서의 강력한 매개 변수 섹션을 참조하십시오.
보기에서 확인란을 사용하여 이러한 역할을 설정할 수 있습니다.
<% 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][]", "" %>
마지막으로 Ability 클래스에서 사용자의 역할을 확인하는 편리한 방법을 추가 할 수 있습니다.
# in models/user.rb
def is?(role)
roles.include?(role.to_s)
end
# in models/ability.rb
can :manage, :all if user.is? :admin
다른 사용자에게 역할을 할당 할 수있는 사용자를 제한하는 방법에 대한 사용자 지정 동작을 참조하십시오.
이 기능은 role_model (코드 & howto)이라는 작은 보석에도 추출되었습니다.
이 비트 마스크 솔루션이 마음에 들지 않으면 분리 된 역할 모델을 참조하십시오.
당분간 attr_accessor를 도입하고 각 역할에 대해 더미 속성을 생성하여 해결했습니다. 나는 역할에 따라 (un) 체크 박스를 설정한다. 일단 저장되면 어떤 값이 변경되었는지 확인하고 적절하게 역할을 추가/제거합니다. 그것은 약간의 잔인한 행동 인 것처럼 보이지만 작동합니다. 누구든지 더 나은 해결책이 있다면 알려주십시오! 감사. –