2010-12-09 2 views
2

after_create를 사용하여 기본 사용자 역할을 구독자로 설정하려고합니다. 그러나 어떤 변화도 나타나지 않습니다. 새 사용자의 역할은 항상 [ ""]입니다.생성 후 역할 설정

많은 일을하지 않습니다 당신이 self.roles << "subscriber"을 set_stub 방법에서는 사용자 모델

class User < ActiveRecord::Base 

    acts_as_authentic 
    after_create :set_sub 
    after_create :set_universal 
    after_create :set_carrier 

    def set_sub 
    self.roles << "subscriber" 
    #self.roles_mask = 4 
    end 

    def set_universal 
     self.channels << Channel.find(1) 
    end 

    def set_carrier 
    @carrier = Carrier.with_name(self.carrier_name) 
    self.carrier<< @carrier 
    end 

    ROLES = %w[admin moderator subscriber] 

    #Each user can subscribe to many channels 
    has_and_belongs_to_many :channels 

    #Each user who is a moderator can moderate many channels 
    #has_many :channel_mods 
    has_and_belongs_to_many :modifies , :class_name => "Channel" 

    #Each user can receive many messages 
    has_and_belongs_to_many :messages 

    #Each user belongs to a carrier 
    belongs_to :carrier 

    #Filter users by role(s) 
    named_scope :with_role, lambda { |role| {:conditions => "roles_mask & #{2**ROLES.index(role.to_s)} > 0 "} } 

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

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

    def role_symbols 
    roles.map do |role| 
    role.underscore.to_sym # NOT role.name.underscore.to_sym (role is a string) 
    end 
    end 


end 

답변

5

. 역할에 의해 반환 된 배열을 수정하지만 다른 것은 수정하지 않습니다.

저장하기 전에 self.role =으로 전화하여 저장해야하므로 저장됩니다. 그들은 관계가 즉시 저장의 방법 정의 <<<<이있는 관계에서 작동하기 때문에

def set_sub 
    self.roles = [ "subscriber" ] 
end 

다른 after_creates이 작동하는 이유이다.

before_validation 및/또는 before_save을 사용하여이 모든 작업을 수행하고 설정하는 것이 좋지만 저장하지 않는 것이 좋습니다. self.channel_ids = [ 1 ]을 설정할 수 있습니다. 즉, 즉시 저장을 시작하지는 않지만 모델에 save을 호출하면 저장됩니다.

+0

고맙습니다. –