ruby-on-rails - Rails3 CMS舒适墨西哥沙发与omniauth路由不匹配

标签 ruby-on-rails ruby ruby-on-rails-3 omniauth comfortable-mexican-sofa

我集成了comfortable-mexican-sofa CMS与我的Rails 3.0.9应用程序和omniauth 0.2.6就位。

博客方面一切正常。我可以登录 cms-admin,使用管理控制台,发布帖子并注销( cms-admin 有自己的身份验证系统,与我的应用程序不同......),然后我可以浏览新帖子。

问题是我的应用程序的其余部分使用omniauth 对用户进行身份验证,当我注销/登录时,出现以下错误:

Started GET "/auth/github" for 127.0.0.1 at 2011-07-25 21:04:46 +0200
  Processing by CmsContentController#render_html as HTML
  Parameters: {"cms_path"=>"auth/github"}
  SQL (0.3ms)  SELECT COUNT(*) FROM "cms_sites"
  Cms::Site Load (0.3ms)  SELECT "cms_sites".* FROM "cms_sites" LIMIT 1
Completed 500 Internal Server Error in 156ms

NoMethodError (undefined method `gsub!' for nil:NilClass):

我的 Gemfile.lock 在这里:http://pastie.org/2270005

任何帮助将不胜感激。 卢卡·G·索阿夫

最佳答案

这是一个路由问题。

Omniauth 通过检测 404 错误页面来工作:

如果它与路由/auth/:provider 匹配,则它捕获请求并将其发送给提供商

...但是comfortable-mexican-sofa cms (如refinery和其他),有一个catch all路由,这就是为什么请求从未返回omniauth可以检测到的404错误的原因。

在舒适的墨西哥沙发案例中,它会通过“cms_path”=>“auth/github”获取

NoMethodError in CmsContentController#render_html
undefined method `gsub!' for nil:NilClass

而不是正确的omniauth路径,应该如下所示:

Started GET "/" for 127.0.0.1 at 2011-07-25 22:27:26 +0200
  Processing by HomeController#index as HTML
Rendered home/index.html.haml within layouts/application (29.5ms)
Completed 200 OK in 44ms (Views: 42.8ms | ActiveRecord: 0.0ms)


Started GET "/auth/github" for 127.0.0.1 at 2011-07-25 22:27:35 +0200
MONGODB gitwatch_dev['users'].find({:provider=>"github", :uid=>1573})


Started GET "/auth/github/callback?code=4334bab983hd5fec19dd" for 127.0.0.1 at 2011-07-25 22:27:36 +0200
  Processing by SessionsController#create as HTML
  Parameters: {"code"=>"4334bab983hd5fec19dd", "provider"=>"github"}
Redirected to http://localhost:3001/
Completed 302 Found in 255ms
MONGODB gitwatch_dev['users'].find({:_id=>BSON::ObjectId('4e23114b1d41c80f180005b2')})


Started GET "/" for 127.0.0.1 at 2011-07-25 22:27:39 +0200
  Processing by HomeController#index as HTML
Rendered home/index.html.haml within layouts/application (415.6ms)
Completed 200 OK in 890ms (Views: 428.6ms | ActiveRecord: 0.0ms)

我的案例的解决方案如下:

在app/controllers/errors_controller.rb中

class ErrorsController < ApplicationController
  def error
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
  end
end

在 config/routes.rb 底部添加

匹配 '/auth/:provider' => 'errors#error'

...在 Omniouth 最后一条路线之后

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

感谢Federico Gonzalez并发送至Oleg Khabarov

我希望这对其他人有帮助;-)

再见卢卡·G·索阿夫

关于ruby-on-rails - Rails3 CMS舒适墨西哥沙发与omniauth路由不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821338/

相关文章:

ruby-on-rails - 在 Ruby on Rails 中,如何将 Base64 编码的字符串设置为 pdf 附件?

ruby - 编写Ruby类方法并获得意外的 token kEND错误

ruby-on-rails-3 - Rspec Controller 传递参数

jQuery遍历dom : Not finding correct location

ruby-on-rails - PG::ConnectionBad fe_sendauth:未提供密码

ruby-on-rails - 我是否需要将所有内容都放在 sidekiq 的 app/workers 中?

ruby - 在使用 Nokogiri 和 Rails 时遇到问题

ruby-on-rails - 显示设计编辑密码屏幕

javascript - html_safe 在rails to javascript 中不起作用

ruby - 如何使用 watir-webdriver 从 text_area 调用 id?