2014-09-02 2 views
2

나는 다음과 같은 문제에 봉착했다. 나는 거기에 간단한 해결책이 있다고 의심하지만, 나는 그것을 알아낼 수 없다. 레일 4.레일 4 | 비트 마스크를 사용하여 양식의 사용자에게 역할 할당 | RoleModel

모든과 내가 Role Model Gem 사용하고

잘 작동하고, 할당 된 역할은 내부 비트 마스크와 같은 사용자 모델의 roles_mask 속성 (정수)에 완벽하게 저장됩니다.

이제 Admins는 양식 (보기)을 통해 사용자로부터 역할을 할당하고 제거 할 수 있습니다. 나는 Rails 닌자가 아니기 때문에 이것을 할 트릭이있을 수 있습니다.

다큐먼트에 따르면, 나는 다음과 같은 작업을 수행 할 수 있습니다 그래서 이해된다

# role assignment 
>> u.roles = [:admin] # ['admin'] works as well 
=> [:admin] 

# adding roles (remove via delete or re-assign) 
>> u.roles << :manager 
=> [:admin, :manager] 

합니다.

그리고 내 방식은 형태의 모든 유효한 역할에 대한 쿼리이었다

# get all valid roles that have been declared 
>> User.valid_roles 
=> [:admin, :manager, :author] 

그런 다음 체크 박스로 나열되어 있습니다. 양식이 제출되면 역할을 할당/제거합니다.

질문 : 올바른 접근 방식인가요? 그렇다면 어떻게 작동합니까?

자세한 내용 here : 여기에 솔루션입니다 - 나는 한번도 문제를 가지고 있기 때문에

+0

당분간 attr_accessor를 도입하고 각 역할에 대해 더미 속성을 생성하여 해결했습니다. 나는 역할에 따라 (un) 체크 박스를 설정한다. 일단 저장되면 어떤 값이 변경되었는지 확인하고 적절하게 역할을 추가/제거합니다. 그것은 약간의 잔인한 행동 인 것처럼 보이지만 작동합니다. 누구든지 더 나은 해결책이 있다면 알려주십시오! 감사. –

답변

2

나는 방법을 알아 냈어. 사용자

많은 역할 나는 (내가 그것을 기호로 작동하는 방식으로이 솔루션을 수정 이하)은 심볼의 형태로 역할을이 답변에 가정 - 그래서 경우에 Pundit 작업을 당신이 그것을 사용하고 있습니다.

# 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)이라는 작은 보석에도 추출되었습니다.

이 비트 마스크 솔루션이 마음에 들지 않으면 분리 된 역할 모델을 참조하십시오.

관련 문제