2012-09-06 13 views
5

NoMethodError (método no definido` persistió??)' Para nada: NilClass):NoMethodError (método no definido `persistió 'para nada: NilClass:

Este es el error que consigo al intentar utilizar OmniAuth con Idear .. .

soy capaz de registrarse para el sitio con facebook ... pero una vez que la sesión y tratar de volver a conectarse consigo el

NoMethodError (método no definido `persistido 'para nada:? NilClass):

clase Mod els :: OmniauthCallbacksController < Diseñar :: OmniauthCallbacksController

def facebook # Debe implementar el siguiente método en su modelo (p. ej. app/modelos/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 

final

def PASSTHRU render: file => " # {} Rails.root /public/404.html",: estado => 404,: layout => false # O, alternativamente, # plantean ActionController :: RoutingError.new ('no encontrado') final

final

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

¿Te implementado 'método find_for_facebook_oauth' en su modelo? ¿Puedes mostrarlo? –

+0

Agregué que ... estoy yendo a través de la wiki de omniauth ... publicaré en este momento – user1502223

+0

cualquier sugerencia sería apreciada – user1502223

Respuesta

2

Su método find_for_facebook_oauth está implícitamente vuelve nula en los casos en que se encuentre un modelo. Debería devolver explícitamente el modelo si lo encuentra en su lugar.

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

En una nota lateral, este es un mal nombre para el método ya que está haciendo más que solo encontrar algo . Tendría más sentido como 'find_or_create_for_facebook_oauth' –

+0

que no funcionó Obtuve un error de sintaxis y se rompió mi sitio – user1502223

+0

devolver el modelo le da un error de sintaxis? ¿Estás seguro de haberlo escrito correctamente? –

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

¿Puede proporcionar una explicación de su respuesta? ¿Por qué funciona esto? –

+0

Soy un novato en Rails, así que puedo estar equivocado sobre el razonamiento, pero creo que el '' 'a menos''' devuelve' '' nil''' si '' 'model''' no es' '' nil''', cuando lo que quiere ser devuelto es '' 'model'''. Ruby devuelve lo último que evalúa, por lo que agregar '' 'model''' al final asegura que Ruby lo devuelva. – Jeff

Cuestiones relacionadas