2015-10-15 3 views
0

Я реализую рельсы webapp, в этом приложении я использую Devise + Omniauth для аутентификации. В моей модели Devise я также использую подтверждающий блок.NoMethodError (неопределенный метод `persisted? 'For true: TrueClass)

Теперь, когда я пытаюсь реализовать социальный логин через OmniAuth на Facebook или Google Я получаю следующее сообщение об ошибке

NoMethodError at /customer/auth/google_oauth2/callback 
    undefined method `persisted?' for true:TrueClass 

Вот код для моего контроллера omniauth_callbacks

class OmniauthCallbacksController < Devise::OmniauthCallbacksController 

    skip_before_filter :authenticate_user! 
    def all 
     p env["omniauth.auth"] 
     user = User.from_omniauth(env["omniauth.auth"], current_user) 
     if user.persisted? 
      flash[:notice] = "You are in..!!! Go to edit profile to see the status for the accounts" 
      sign_in_and_redirect(user) 
     else 
      session["devise.user_attributes"] = user.attributes 
      redirect_to new_user_registration_url 
     end 
    end 

     def failure  
     super 
     end 


    alias_method :facebook, :all 
    alias_method :google_oauth2, :all 
end 

Это код фрагмент из моей пользовательской модели

класс Пользователь < ActiveRecord :: Base

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable,:confirmable,:token_authenticatable 

def self.from_omniauth(auth, current_user)  
    authorization = Authorization.where(:provider => auth.provider, 
        :uid => auth.uid.to_s, 
        :token => auth.credentials.token, 
        :secret => auth.credentials.secret).first_or_initialize 

    if authorization.user.blank? 
     user = current_user || User.where('email = ?', auth["info"]["email"]).first   
     if user.blank?  
      user = User.new 
      user.name = auth.info.name 
      user.email= auth.info.email 
      if auth.provider == "twitter" 
      user.save(:validate => false) 
      else 
      user.skip_confirmation! 
      user.save(:validate => false) 
      end 
     end 
     authorization.username = auth.info.nickname 
     authorization.user_id = user.id 
     authorization.save 
    end 
    authorization.user 
end 

конца

Моя модель пользователя имеет много модели авторизации (созданной для обработки счетов от нескольких поставщиков)

class Authorization < ActiveRecord::Base 
    belongs_to :user 

    after_create :fetch_details 



    def fetch_details 
     self.send("fetch_details_from_#{self.provider.downcase}") 
    end 


    def fetch_details_from_facebook 
     graph = Koala::Facebook::API.new(self.token) 
     facebook_data = graph.get_object("me") 
     self.username = facebook_data['username'] 
     self.save 
    end 
end 

Может кто-нибудь помочь мне в поиске, почему я получаю эту неопределенного метода `сохранялось ? для true: TrueClass

ошибка?

ответ

0

Какая роль помощник current_user в строке omniauth? Я предполагаю, что он создает какой-то конфликт с переменной среды omniauth.

Попробуйте изменить:

user = User.from_omniauth(env["omniauth.auth"], current_user) 

к:

user = User.from_omniauth(env["omniauth.auth"]) 
+0

Делая это давая ** неверное число аргументов (1 на 2) ** Ошибка –

+0

Перейти к модели пользователя и посмотреть, как метод .from_omniauth определен или обрабатывается с помощью разработки? – miler350

+0

Да, удалив параметр current_user из пользовательской модели, сделал работу .. Спасибо –

Смежные вопросы