2012-09-06 21 views
5

NoMethodError (metoda niezdefiniowany` trwało?)' Do zera: NilClass):NoMethodError (metoda niezdefiniowany `trwało 'do zera: NilClass:

Jest to błąd pojawia się podczas próby użycia omniauth ze opracować .. .

jestem w stanie Zapis na miejscu z Facebook ... ale po wylogowaniu i spróbuj zalogować się ponownie i dostać

NoMethodError (metoda niezdefiniowany `utrzymywało„do zera: NilClass):

klasa Mod els :: OmniauthCallbacksController < Wymyślenie :: OmniauthCallbacksController

def facebook # Musisz zastosować poniższą metodę w swoim modelu (np. Aplikacja/wzory/user.rb) @model = Model.find_for_facebook_oauth (request.env [ "omniauth.auth"] current_model)

if @model.persisted? 
    flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook" 
    sign_in_and_redirect @model, :event => :authentication 
else 
    session["devise.facebook_data"] = request.env["omniauth.auth"] 
    redirect_to new_model_registration_url 
end 

koniec

def pośredni render: plik => " # {Rails.root} /public/404.html”: status => 404: layout => false # lub alternatywnie # podnieść ActionController :: RoutingError.new ('Not Found') koniec

koniec

model.rb

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

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :name, :email, :password, :password_confirmation, :remember_me, :provider, :uid 
    # attr_accessible :title, :body 

    def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    model = Model.where(:provider => auth.provider, :uid => auth.uid).first 
    unless model 
    model = Model.create(name:auth.extra.raw_info.name, 
         provider:auth.provider, 
         uid:auth.uid, 
         email:auth.info.email, 
         password:Devise.friendly_token[0,20] 
         ) 
    end 
    end 


    def self.new_with_session(params, session) 
    super.tap do |model| 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
     model.email = data["email"] if model.email.blank? 
     end 
    end 
    end 
end 
+0

Czy realizowane 'find_for_facebook_oauth' metody w modelu? Czy możesz to pokazać? –

+0

Dodałem, że ... idę przez wiki omniauth ... będę pisać teraz – user1502223

+0

wszelkie sugestie byłyby doceniane – user1502223

Odpowiedz

2

Twoja metoda find_for_facebook_oauth jest niejawnie powrocie zero w przypadkach, gdy model został znaleziony. Powinieneś jawnie zwrócić model, jeśli zostanie znaleziony.

def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    model = Model.where(:provider => auth.provider, :uid => auth.uid).first 
    return model if model 
    model = Model.create(name:auth.extra.raw_info.name, 
         provider:auth.provider, 
         uid:auth.uid, 
         email:auth.info.email, 
         password:Devise.friendly_token[0,20] 
         ) 
end 
+0

Na marginesie, jest to zła nazwa dla metody, ponieważ robi coś więcej niż tylko znajdowanie czegoś . Miałoby to więcej sensu jako 'find_or_create_for_facebook_oauth' –

+0

który nie działał Mam błąd składniowy i złamał moją witrynę – user1502223

+0

zwrócenie modelu daje błąd składni? Jesteś pewien, że napisałeś to poprawnie? –

2
def self.find_for_facebook_oauth(auth, signed_in_resource=nil) 
    model = Model.where(:provider => auth.provider, :uid => auth.uid).first 
    unless model 
    model = Model.create(name:auth.extra.raw_info.name, 
        provider:auth.provider, 
        uid:auth.uid, 
        email:auth.info.email, 
        password:Devise.friendly_token[0,20] 
        ) 
    end 
    model #Add this here 
end 
+0

Czy możesz podać wyjaśnienie swojej odpowiedzi? Dlaczego to działa? –

+0

Jestem początkującym dla Rails, więc mogę się mylić w uzasadnieniu, ale wierzę, że '' 'chyba' '' zwraca '' 'nil''' jeśli' '' model''' nie jest '' ' nil''', kiedy to, co chcesz zwrócić, to '' 'model'''. Ruby zwraca ostatnią rzecz, którą ocenia, więc dodanie "modelu" na końcu zapewnia, że ​​zwraca go Ruby. – Jeff

Powiązane problemy