Ruby on Rails没有这样的专栏:authentication.provider:Omniauth

时间:2013-07-02 02:45:30

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 omniauth

我在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

讨厌成为一个负担...但时钟真的在滴答作响,我的屁股已经上线了,而我将要彻底疯狂地试图解决这个问题。如果你能告诉我为什么提供者不被接受,我相信我可以弄明白其余的。

3 个答案:

答案 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"}}}