Путаница с массовым назначением в ассоциации рельсов

У меня возникли проблемы с чем-то, что, я уверен, является основным, но также у меня возникли проблемы с поиском хорошего ответа здесь, на 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.

Итак, я очень новичок в этом, но не понимаю, почему это не работает. Может кто-нибудь объяснить, что я делаю неправильно?

Спасибо Мустафа


person Mustafakidd    schedule 24.06.2013    source источник


Ответы (1)


Используйте attr_accessible :provider, :uid, :user должно работать. Или изменить

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

to

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