我在Omniauth上关注本教程:http://railscasts.com/episodes/235-omniauth-part-1?view=asciicast
我一直收到这个错误:
没有这样的专栏:authentication.provider:
现在主要的东西我想知道为什么“提供者”不被接受。它存在于类中......认证数据库存在......那么为什么它说不存在呢?
这是我的身份验证控制器:
class AuthenticationsController < InheritedResources::Base
def index
@authentications = current_user.authentications if current_user
end
def create
@user = User.where(authentication: auth).first_or_create(:provider => auth['provider'], :uid => auth['uid'])
self.current_user = @user
# auth = request.env["omniauth.auth"] current_user.authentications.create(:provider => auth['provider'], :uid => auth['uid'])
flash[:notice] = "Authentication successful."
redirect_to authentications_url
end
def auth
request.env['omniauth.auth']
end
def destroy
@authentication = current_user.authentications.find(params[:id])
@authentication.destroy
flash[:notice] = "Successfully destroyed authentication."
redirect_to authentications_url
end
end
我可以向您保证我有一个名为身份验证的模型,并且该模型具有提供者和uid字段。我也尝试过哪里(身份验证:auth)和where(auth:auth) 每个都没有运气。
任何想法都会受到赞赏。
更新
authentication.rb(model)
class Authentication < ActiveRecord::Base
attr_accessible :create, :destroy, :index, :provider, :uid, :user_id
belongs_to :user
end
更新2
我基本上是在尝试将本教程改编为rails 3.2。
教程中的原始行已在上面注释掉。
更新3 这是整个第一行错误:
讨厌成为一个负担...但时钟真的在滴答作响,我的屁股已经上线了,而我将要彻底疯狂地试图解决这个问题。如果你能告诉我为什么提供者不被接受,我相信我可以弄明白其余的。SQLite3 :: SQLException:没有这样的列:authentication.provider:SELECT“users”。* FROM“users”WHERE“authentication”。“provider”='facebook'和“authentication”。“uid”='2222222' AND“authentication”。“info”='---!ruby / hash:OmniAuth :: AuthHash :: InfoHash
答案 0 :(得分:0)
您的创建操作无法理解
User.where(authentication: auth)
转换为SELECT * FROM users WHERE authentication = a_hash
你应该做点什么
auth1 = Authentication.where(provider: auth['provider'], uid: auth['uid']).first
if !auth1.nil?
current_user = auth.user
else
user = User.new
user.authentications.build(provider: auth['provider'], uid: auth['uid'])
user.save!
current_user = user
end
答案 1 :(得分:0)
由于您只是在authentications
表中添加记录,因此我无法理解您重新分配this.current_user
的原因。也是current_user
辅助方法或成员,如果它是成员,它在哪里声明?
您是否只想为当前用户创建身份验证?:
def create
current_user.authentications.first_or_create(:provider => auth['provider'], :uid => auth['uid'])
flash[:notice] = "Authentication successful."
redirect_to authentications_url
end
按提供者和uid查找第一个身份验证记录,如果未找到,则创建该身份验证记录。
同样由于这个错误,我希望你已经找到了这个问题的答案:
现在我想知道的主要原因是为什么“提供者”不存在 公认。它存在于类......认证数据库中 存在......所以为什么说它不在那里?
这是因为您在first_or_create()
对象上调用了User
,而不是Authentication
。
答案 2 :(得分:0)
我最近也遇到过这个问题。起初我以为我忘了在users表中添加一个提供者列,但事实并非如此。 这就是我最终解决它的方式:
def self.from_omniauth(auth)
where(provider: auth["provider"], uid: auth["uid"]).first_or_create do |user|
user.email = auth["info"]["email"]
user.password = Devise.friendly_token[0, 20]
user.logo = auth["info"]["image"]
# if you use confirmable, since facebook validates emails
# skip confirmation emails
user.skip_confirmation!
end
end
auth是一个类似下面的哈希值,所以我使用auth [“provider”]等代替auth.provider:
omniauth.auth: {"provider"=>"facebook", "uid"=>"11111111111111", "info"=>{"email"=>"some@email.com", "image"=>"http://graph.facebook.com/v2.6/11111111111111/picture"}, "credentials"=>{"token"=>"sometoken", "expires_at"=>1506680013, "expires"=>true}, "extra"=>{"raw_info"=>{"email"=>"some@email.com", "id"=>"11111111111111"}}}