由于'redirect_to root_url'未传递操作而导致的RoutingError

时间:2011-08-10 15:13:04

标签: ruby-on-rails-3 cancan rails-admin

使用Devise进行身份验证并使用CanCan进行授权的标准Rails_Admin安装,以非管理员用户身份访问http://localhost:3000/admin会生成以下服务器日志:

Started GET "/admin" for 127.0.0.1 at 2011-08-09 22:46:10 -0400
  Processing by RailsAdmin::MainController#index as HTML
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Completed 404 Not Found in 151ms

ActionController::RoutingError (No route matches {:controller=>"gyms"}):
  app/controllers/application_controller.rb:5:in `block in <class:ApplicationController>'

直到最后一部分的一切似乎都没问题。据我所知,CanCan可以正确地解救异常,并尝试通过以下代码重定向到root_url:

class ApplicationController < ActionController::Base
  protect_from_forgery

  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end
end

TopOut::Application.routes.draw do
  mount RailsAdmin::Engine => '/admin', :as => 'rails_admin'
  devise_for :users

  resources :gyms

  root :to => "gyms#index"
end

但出于某种原因,在重定向到root_url时,CanCan只是试图点击

{:controller=>"gyms"}

而不是

{:controller=>"gyms", :action=>"index"}

这可能是CanCan的一个问题吗?或者是否存在我在文档中遗漏的redirect_to或root_url的某些特定方面?

注意:这是我在CanCan的github页面上打开的问题的副本,所以如果另一个解决了,我肯定会关闭一个。

1 个答案:

答案 0 :(得分:6)

根据Github用户的反馈,看来路由是name_scoped,因此这是预期的行为。

正确的解决方法是从main_app调用root_url,如下所示:

rescue_from CanCan::AccessDenied do |exception|
  redirect_to main_app.root_url, :alert => exception.message
end

解决方案的归功于https://github.com/sferik/rails_admin/issues/658

的bbenezech