2013-06-24 43 views
0

在我確定的事情上遇到一些麻煩是基本的,但也很難在SO上找到一個好的答案。軌道協會中的質量任務混亂

我有一個用戶表和授權表,這裏是我的模型:

##Authorization.rb 
class Authorization < ActiveRecord::Base 
    attr_accessible :provider, :uid, :user_id 
    belongs_to :user 
    validates :provider, :uid, :presence => true 


    def self.find(auth_hash) 
    find_by_provider_and_uid(auth_hash["provider"], 
          auth_hash["uid"]) 
    end 

    def self.create_with_hash(auth_hash) 
    #if they've already registered, then just return that authorization 

    unless auth = find_by_provider_and_uid(auth_hash["provider"], 
              auth_hash["uid"]) 
     user = User.create(name: auth_hash["info"]["name"], 
         email: auth_hash["info"]["email"], 
         nickname: nil, 
         firstname: auth_hash["info"]["first_name"], 
         location: auth_hash["user_location"] 
         ) 

     auth = create(user: user, 
        provider: auth_hash["provider"], 
        uid: auth_hash["uid"]) 
    end 

    auth 
    end 

end 

我的用戶模型:

##User.rb 
require 'bcrypt' 

class User < ActiveRecord::Base 
    include BCrypt 

    #accessible and settable properties 
    attr_accessible :name, :email, :nickname, :firstname, :location 

    #relations 
    has_many :authorizations, dependent: :destroy 

    #validations 
    validates :name, :email, :firstname, :presence => true 
    validates :email, :uniqueness => true 
    validates :nickname, :uniqueness => true 

    #always make sure their email and nickname are lowercased 
    def before_validation(user) 
    user.email.downcase! 
    user.email = Password.create(email) 
    user.nickname.downcase! 
    end 

    def after_save(user) 
    user.email = Password.new(user.email) 
    end 

    def is_nickname_available?(nickname) 
    Users.find_by_nickname(nickname.downcase).blank? 
    end 

    def add_nickname(user_id, nickname) 
    #todo: error handling 
    user = Users.find(user_id).update_attribute(nickname: nickname) 
    end 

    def add_provider(auth_hash) 
    #Check if the provider already exists, so we don't add it twice 
    unless 
     authorizations.find_by_provider_and_uid(auth_hash["provider"], 
               auth_hash["uid"]) 
     Authorization.create user_id:self.id, 
     provider: auth_hash["provider"], 
     uid: auth_hash["uid"] 
    end 
    end 

end 

在控制器,如果我嘗試做的事:Authorization.create_with_hash(auth_hash),我得到的錯誤:

Can't mass-assign protected attributes: user 

上線auth = create(user: user, provider: auth_hash["provider"], uid: auth_hash["uid"])在我Authorization.rb MOD埃爾。

所以,我對此很新,但不清楚爲什麼這不起作用。有人能解釋我做錯了什麼嗎?

感謝 穆斯塔法

回答

0

使用attr_accessible :provider, :uid, :user應該工作。或更改

auth = create(user: user, 
       provider: auth_hash["provider"], 
       uid: auth_hash["uid"]) 

auth = create(user_id: user.id, 
       provider: auth_hash["provider"], 
       uid: auth_hash["uid"])