【问题标题】:Omniauth NoMethodError in SessionsControllerSessionsController 中的 Omniauth NoMethodError
【发布时间】:2012-11-21 20:43:54
【问题描述】:

嗨,我正在尝试运行 Railscast 的 #241 - 使用 Omniauth 进行 twitter - 最终使用 facebook。我尝试制作的应用程序需要 Facebook 的登录,但由于有一个关于如何使用 twitter 登录的视频,不妨先关注它,但我遇到了问题。

我在登录 Twitter 后不断收到此错误消息。 “SessionController#create 中的 NoMethodError” - nil:NilClass 的未定义方法“[]”。这是相关代码。

class SessionsController < ApplicationController
    def create
        auth = request.env["omniauth.auth"]
        user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) || User.create_with_omniauth(auth)
        session[:user_id] = user.id
        redirect_to root_url, :notice => "Signed in!"
    end
end

我还通过 dev.twitter.com 设置了网站和回调链接,如下所示: 网站:“http://127.0.0.1:3000” 回调:“http://127.0.0.1:3000/auth/twitter/callback”

config/initializers 中的 Omniauth.rb:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, 'CONSUMER_KEY', 'CONSUMER_SECRET'
end

(我已经提供了消费者密钥和秘密)

Application.html.erb

<div id="user_nav">
  <%= link_to "Sign in with Twitter", "/auth/twitter" %>
</div>

在 routes.rb 中添加了这一行

match "/auth/:provider/callback" => "sessions#create"

用户.rb

class User < ActiveRecord::Base
  attr_accessible :name, :provider, :uid

  def self.create_with_omniauth(auth)
    create! do |user|
      user.provider = auth["provider"]
      user.uid = auth["uid"]
      user.name = auth["user_info"]["name"]

  end
end

我不知道我哪里错了

【问题讨论】:

  • 是因为我的数据库中没有“twitter”用户吗?但不可能,因为我使用 twitter 登录,因此它不需要匹配我的 User 表。虽然我想增加他们的登录凭据并将其放入我的数据库并为他们创建一个登录名

标签: omniauth


【解决方案1】:

好的,我发现了问题。花了我一段时间。

Twitter 将他们的“user_info”元素更改为“info” 所以不是

user.name = auth["user_info"]["name"] 

是的

user.name = auth["info"]["name"]

接下来要改变的是来自

的会话控制器
session[:user_id] = user.id

session[:user_id] = user.uid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多