【问题标题】:Devise + Omniauth + Twitter + Rails 4设计 + Omniauth + Twitter + Rails 4
【发布时间】:2013-09-30 09:29:45
【问题描述】:

我在这上面花了几个小时,所以我在这里。从 Ryans Railscast 开始,我决定将 twitter 登录添加到我的 rails / devise 应用程序中。我关注了一段时间,遇到了问题并解决了各种问题,直到我到达这里:单击“使用 twitter 登录”时,我被重定向到那里,返回后,我收到以下问题:

ActiveRecord::StatementInvalid in Users::OmniauthCallbacksController#twitter

SQLite3::SQLException: 没有这样的列:users.provider: SELECT "users".* FROM "users" WHERE "users"."provider" = 'twitter' AND "users"."uid" = '20323034' ORDER BY "users"."id" ASC LIMIT 1

这个问题与其他 stackoverflow 问题非常接近,除了他们使用的是 facebook 登录而不是 twitter。查看最佳答案的最佳评论:

Devise, Omniauth and Facebook integration session error

请指教,谢谢!

路线: devise_for :users, :controllers => { :omniauth_callbacks => "users/omniauth_callbacks", :registrations => "registrations" } 做

获取“信息/联系方式” 获取“信息/关于” 获取“信息/着陆” 获取“信息/测试” 获取 '/users/sign_out' => 'devise/sessions#destroy'

根“信息#登陆” 结束

资源:事件做 资源:注册 结尾 结束

宝石文件:

gem 'zurb-基础'

宝石'设计'

gem 'omniauth-twitter'

gem 'omniauth'

宝石'oauth2'

【问题讨论】:

  • 您的用户表中有provider 的列吗?
  • 您是否曾在某一时刻运行rake db:migrate 来添加它?
  • 运行 rake,没有添加任何内容。我对添加列感到紧张,以防我不需要它并且还有其他问题。看起来像一个兔子洞。
  • 嗯.. 这很简单:SQLite3::SQLException: no such column: users.provider 你应该标记他的答案。

标签: ruby-on-rails devise oauth-2.0 twitter-oauth


【解决方案1】:

我将尝试以更全面的答案做出回应,但对于初学者来说,会抛出此错误,因为您尚未在 User 模型中添加列来存储提供者名称(即“twitter”)。您还需要存储 twitter 访问令牌、twitter uid 和 twitter 密码。 Facebook Omniauth 只需要提供者、access_token 和 uid 列,但 Twitter 需要存储除这些之外的秘密。

您在控制器中使用什么逻辑?

从终端运行以下迁移:rails g migration AddTwitterColumnsToUsers

class AddTwitterColumnsToUsers < ActiveRecord::Migration
  def change
    add_column :users, :provider, :string
    add_column :users, :access_token, :string
    add_column :users, :uid, :string
    add_column :users, :twitter_secret, :string
  end
end

然后从终端:rake db:migrate

【讨论】:

  • 我移动了它,它现在驻留在 Controllers/Users/ Gist 中:gist.github.com/piratebroadcast/976ca80fbe0afb9e23ef 如果您觉得不错,我将运行您的迁移。非 oauth 注册和 Nil 值会出错吗?谢谢。
  • 跑了,现在有这个错误:未知属性:名称返回注册用户否则用户=用户.创建(名称:auth.info.name,提供者:auth.provider,uid:auth.uid,电子邮件:auth.uid+"@twitter.com",
  • 您的用户表中有“名称”列吗?错误中提到的方法是尝试将用户名保存到名为“name”的列中。下面的方法在哪里? User.create(name:auth.info.name, provider:auth.provider...
猜你喜欢
  • 2013-09-04
  • 2014-08-14
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多