2011-04-29 2 views
0

처음으로 roles_mask와 함께 cancan을 사용합니다. 계속 편집보기에서 undefined method '&' for "1":String을 유지하십시오.레일 cancan을 처음으로 roles_mask와 함께 사용

<% for role in User::ROLES %> 
     <%= check_box_tag "user[roles][]", role, @user.roles.include?(role) %> 
     <%=h role.humanize %><br /> 
    <% end %> 
    <%= hidden_field_tag "user[roles][]", "" %> 
<% end %> 

user.rb

class User < ActiveRecord::Base 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 


    attr_accessible :email, :password, :password_confirmation, :remember_me, :firstname, :lastname, :username, :roles 
    ROLES = %w[admin manager employee banned] 

     def roles=(roles) 
     self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum 
     end 

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

     def role?(base_role) 
     ROLES.index(base_role.to_s) <= ROLES.index(role) 
     end 

     def is?(role) 
     roles.include?(role.to_s) 
     end 
end 

답변

0

form.html.erb

당신은 어딘가에 "1"로 roles_mask을 정의하고 있습니까? 비트 클래스 & 연산자가 문자열 클래스에 정의되어 있지 않기 때문에 역할 접근자가 죽어 가고 있습니다. role setter를 호출하는 곳에서 roles_mask_var.to_i를 수행해야 할 수도 있습니다.

ian.

+0

나쁨. 마이 그 레이션에 "string"이 미쳐서 roles_mask가 정수가 아닌 문자열이되었습니다. – pcasa