I am following OmniAuth railscasts and trying to implement the same with authlogic + facebook instead of devise + twitter as shown in the railscast.
Maybe my understanding of has_many still isn't good but in the railscasts ryan has the following code in 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
In my implementation current_user.authentications returns an array [] how can I call find_or_create_by_provider_and_uid on an array?
Is my implementation wrong? Isn't has_many suppose to return an array?
Error I get is that I am calling find_or_create_by_provider_and_uid on a nil object.
current_user.authentications is nil well because the user does not have any authentications yet.
The array is actually an AssociationProxy instance, which delegates all method calls to the internal object, which is an array in the case of a has_many association (also see this question). This means you should be able to call magic methods like find_or_create_by_provider_and_uid, as well as scopes etc. on it just fine.
I found this question because I stumbled over a similar problem: for some reason I couldn't call ActiveRecord::Relation#klass to find out the model class:
post.comments.klass # => NoMethodError
But by calling relation first you can get a normal ActiveRecord::Relation instance:
post.comments.relation.klass # => Comment
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With