2011-06-02 36 views
6

Estoy siguiendo OmniAuth railscasts y trato de implementar lo mismo con authlogic + facebook en lugar de idear + twitter como se muestra en la transmisión de rieles.has_many devuelve una matriz en lugar de la clase ActiveRecord

Tal vez mi comprensión de has_many todavía no es buena, pero en los Railscasts Ryan tiene la following code en AuthenticationsController

def create 
    auth = request.env["rack.auth"] 
    current_user.authentications.find_or_create_by_provider_and_uid(auth['provider'], auth['uid']) 
    flash[:notice] = "Authentication successful." 
    redirect_to authentications_url 
    end 

En mi aplicación current_user.authentications devuelve una matriz [] ¿Cómo puedo llamar find_or_create_by_provider_and_uid en una matriz?

¿Está mal mi implementación? ¿No se supone que has_many devuelve una matriz?

Error que recibo es que estoy llamando al find_or_create_by_provider_and_uid en un objeto nil.

current_user.authentications no está nada bien porque el usuario aún no tiene ninguna autenticación.

+0

¿Está seguro de que está utilizando Rails 3, o está utilizando una versión anterior de Rails? –

+0

positivo sobre esto siendo raíles 3. Tuve este problema anoche, pensé que iba a preguntar aquí antes de abordarlo de nuevo en mi casa. Quizás hay algo mal en mi fuente. pero no debería 'has_many' traer de vuelta una matriz? – Omnipresent

+0

Me parece que lo que has codificado debería funcionar. ¿Ha verificado que no está anulando la relación de autenticación con una función propia (por ejemplo, en la clase de usuario o en un módulo relacionado)? Sin ver más código, esto es realmente todo lo que puedo pensar. –

Respuesta

5

La matriz es realmente una instancia AssociationProxy, que delega todas las llamadas al objeto interno, que es una matriz en el caso de una asociación has_many (también vea this question). Esto significa que deberías poder llamar a métodos mágicos como find_or_create_by_provider_and_uid, así como también a los ámbitos, etc.

me encontré con esta pregunta porque tropecé con un problema similar: por alguna razón no podía llamar ActiveRecord::Relation#klass para averiguar la clase del modelo:

post.comments.klass # => NoMethodError 

Pero llamando relation primero se puede obtener una normalidad ActiveRecord::Relation instancia:

post.comments.relation.klass # => Comment 
Cuestiones relacionadas