OmniAuth路由错误,没有路由匹配

scu*_*omb 14 ruby-on-rails omniauth

我正在通过Ryan Bates railscast#235 OmniAuth第1部分,使用OmniAuth gem允许用户使用Twitter或Facebook以及更高版本的Google Apps登录我的网络应用程序.

现在我遇到了这个错误

Routing Error

No route matches [GET] "/auth/twitter"
Run Code Online (Sandbox Code Playgroud)

我已经正确设置了routes.rb文件来处理auth回调提供程序匹配,如下所示:

  match "/auth/:provider/callback" => "authentications#create"
Run Code Online (Sandbox Code Playgroud)

当我链接到localhost:3000/auth/twitter时,我收到此错误.Bates在他的Railscast -07:36.

什么可能解决这个问题?这会是routes.rb的问题吗?还是omniauth.rb?

我们的omniauth.rb看起来像这样:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'OURCONSUMERKEY', 'OURCONSUMERSECRET'
  provider :twitter,  'OURCONSUMERKEY', 'OURCONSUMERSECRET'
end
Run Code Online (Sandbox Code Playgroud)

Tom*_*ogg 17

您需要在Devise gem使用的模型中注释掉':omniauthable'(通常是模型'User'= user.rb文件):

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable,
         :rememberable, :trackable, :validatable # plus whatever other calls...
       # :omniauthable

  [...]

end
Run Code Online (Sandbox Code Playgroud)

使用':omniauthable'调用意味着加载devise/omniauth组件(这会导致与omniauth设置冲突).


lik*_*sky 10

fyi,如果你遇到这个问题并且你正在将Devise 2.1.x与OmniAuth 1.x和OAuth2结合起来,请注意现在最好的做法是使用/users/auth/facebook(即控制器中的目录,' users/'). ..

因此,你需要点击/users/auth/facebook,尽管OmniAuth的几乎所有教程,示例和指南都说要点击/auth/facebook!这(结合Facebook不会更新我的网站URL直到我添加端口#:3000,保存,传播并点击它,然后再将其删除)这一事实,让我难以忍受一段时间,这将保持不言而喻,以保护懊恼.:-)

此外,不像现在大多数选票答案 - 当然解决问题,但不允许你与Devise集成 - 我不需要:omniauthable从Devise中删除(一旦我点击了正确的URL).当我使用错误的URL时,它只会"导致冲突".

编辑:此外,与原始问题不同,使用Devise 2.1.x和OmniAuth 1.x,据我所知,人们不需要omniauth.rb为Rack 创建一个命名初始化程序 - 使用Devise,你只需要添加你的OmniAuth位到config/initializers/devise.rb(但不是100%肯定这个).有关更多详细信息,请参阅顶部的Facebook示例部分下的plataformatec/devise的OmniAuth概述.


小智 0

SB,我可以提个建议吗?首先查找第 241 集。这是比较简单的情节。我倾向于认为你的问题不在于routes.rb。我正在使用 OmniAuth 来验证用户身份并代表我的用户发送推文,而我拥有的该部分的唯一路由是:

 match "/auth/twitter/callback" => "sessions#create"
 match "/signout" => "sessions#destroy", :as => :signout
Run Code Online (Sandbox Code Playgroud)