我正在关注OmniAuth railscasts并尝试使用authlogic + facebook实现相同的功能,而不是像railscast中所示的设计+ twitter。
也许我对has_many
的理解仍然不好,但在railscast中,ryan在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
在我的实现中current_user.authentications
返回一个数组[]
如何在数组上调用find_or_create_by_provider_and_uid
?
我的实施错了吗?是不是has_many
假设返回一个数组?
我得到的错误是我在find_or_create_by_provider_and_uid
对象上调用nil
。
current_user.authentications
没有问题,因为用户还没有任何身份验证。
答案 0 :(得分:5)
该数组实际上是一个AssociationProxy
实例,它将所有方法调用委托给内部对象,在has_many
关联的情况下这是一个数组(另见this question)。这意味着你应该可以调用像find_or_create_by_provider_and_uid
这样的魔术方法,以及范围等等。
我发现了这个问题,因为我偶然发现了类似的问题:由于某些原因,我无法调用ActiveRecord::Relation#klass
来查找模型类:
post.comments.klass # => NoMethodError
但首先调用relation
可以获得正常的ActiveRecord::Relation
实例:
post.comments.relation.klass # => Comment