【问题标题】:NoMethodError in SessionsController#create - Undefined method '[]' for #<Oauth::Access_Token...>SessionsController#create 中的 NoMethodError - #<Oauth::Access_Token...> 的未定义方法“[]”
【发布时间】:2013-10-08 03:21:38
【问题描述】:

我在用户模型中存储用户的 Twitter 访问令牌时遇到了一些问题。我已经按照Railscast #241 安装了 Omniauth gem,并成功设置了 Twitter 身份验证,存储了“uid”和“name”。为了进行经过身份验证的 Twitter API 调用,我想存储用户的访问令牌和访问令牌秘密,因此创建了一个迁移来创建这些字段。我成功地做到了,并且可以在 Rails 控制台中成功地将这些字段分配给没有存储的记录。但是,当尝试对新用户进行身份验证并从一开始就提取此信息时,我收到标题中列出的错误。这里是额外的错误信息:

app/models/user.rb:13:in `block in create_from_omniauth'
app/models/user.rb:10:in `create_from_omniauth'
app/models/user.rb:6:in `from_omniauth'
app/controllers/sessions_controller.rb:5:in `create'

我沿着从会话控制器到用户模型的这条路径,但无法弄清楚是什么导致了错误。我在下面包含了这些文件。

会话控制器 类 SessionsController

def create
    user = User.from_omniauth(env["omniauth.auth"])
    session[:user_id] = user.id
    redirect_to root_url, notice: "Signed in"
end

def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: "Signed out"
end

end

用户模型

class User < ActiveRecord::Base
  attr_accessible :name, :uid, :access_token, :access_token_secret
  has_many :events

  def self.from_omniauth(auth)
    where(auth.slice('uid')).first || create_from_omniauth(auth)
  end

  def self.create_from_omniauth(auth)
create! do |user|
  user.uid = auth["uid"]
  user.name = auth["info"]["nickname"]
      user.access_token = auth["extra"]["access_token"]["token"]
      user.access_token_secret = auth["extra"]["access_token"]["secret"]
    end
  end

end

谁能帮我解决这个错误?我知道这与在 create_from_omniauth 方法中设置 access_token 字段有关,因为没有它们它可以正常工作。我一直在努力想弄清楚为什么这些不起作用。提前感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails oauth omniauth


    【解决方案1】:

    我怀疑你为什么需要保存这些令牌,因为它们看起来毫无用处。在这种情况下,最重要的是 Twitter 返回的用于识别或创建用户的 uid。

    无论如何,你的错误原因是没有这样的键。

    auth['extra']['access_token'] 是一个字符串,没有其他子键。

    :extra => {
      :access_token => "", # An OAuth::AccessToken object
    

    要访问tokensecret,您可以使用auth['credentials']

    :credentials => {
      :token => "a1b2c3d4...", # The OAuth 2.0 access token
      :secret => "abcdef1234"
    },
    

    参考:

    【讨论】:

    • 非常感谢您帮我解决问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    相关资源
    最近更新 更多