Rails: Omniauth & Devise. Получение нулевого объекта неожиданно - PullRequest
1 голос
/ 01 августа 2011

Я следовал Railscasts (версии ASCII) # 235 и и часть # 236, чтобы настроить создание аутентификаций пользователей с использованием OmniAuth & Devise: OmniAuth Часть 1 OmniAuth Часть 2

Я нахожусь на этапе, когда я только что изменил create метод authentications controller, чтобы пользователь, не вошедший на сайт, мог войти напрямую через твиттер. Код для метода create выглядит следующим образом:

  def create  
    omniauth = request.env["omniauth.auth"]  
    authentication = Authentication.find_by_provider_and_uid(omniauth['provider'], omniauth['uid'])  
    if authentication  
     flash[:notice] = "Signed in successfully."
     logger.info("AUTHENTICATION: #{authentication.inspect}")
     #logger.info("AUTHENTICATION METHODS: #{authentication.methods.sort}")
     logger.info("authentication.user: #{authentication.user}")
     #logger.info("authentication.user.nil?: #{authentication.user.nil?}")
     #logger.info("authentication.user.id: #{authentication.user.id}")  
     sign_in_and_redirect(:user, authentication.user)  
    else  
     current_user.authentications.create(:provider => omniauth['provider'], :uid => omniauth['uid'])  
     flash[:notice] = "Authentication successful."  
     redirect_to authentications_url  
    end  
  end  

Теперь, когда я перехожу к /auth/twitter, я получаю эту ошибку:

No route matches "/auth/failure"

Это потому, что authentication.user это nil. Код для метода create точно такой же, как в Railscast, и я не понимаю, почему authentication.user равен нулю.

Это вывод authentication.inspect:

#<Authentication id: 1, user_id: 1, provider: "twitter", uid: "319521616", created_at: "2011-08-01 10:32:48", updated_at: "2011-08-01 10:32:48">

Кто-нибудь знает, почему authentication.user будет nil, даже если метод inspect возвращает действительные данные.

Вот код от моей модели пользователя:

class User < ActiveRecord::Base
  has_many :authentications
  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable,
     :lockable, :confirmable #Added lockable and confirmable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me
end

1 Ответ

1 голос
/ 02 августа 2011

Есть ли у вас какие-либо проверки в вашей пользовательской модели?Это вызвало молчаливый сбой при сохранении пользовательской модели, что привело к появлению сообщения об ошибке, которое вы описываете, когда я сделал ту же настройку.Всего одна идея.

...