【问题标题】:rails_admin working in development but not in production or herokurails_admin 从事开发工作,但不在生产或 heroku 工作
【发布时间】:2011-08-24 12:21:53
【问题描述】:

我有一个非常基本的 Rails 3.1rc6 应用程序,上面基本上只有 Devise、CanCan 和 rails_admin,还有一些非常简单的模型。

在开发环境 rails_admin 工作正常,我可以点击localhost:3000/admin 并以我的管理员用户登录后,我可以查看所有数据并进行管理。

但是当我部署到 Heroku 并尝试点击 appname.herokuapp.com/admin 时,我得到“您要查找的页面不存在。您可能输入了错误的地址或页面可能已移动”。这是 Heroku 日志的尾部:

app[web.1]: 
app[web.1]: 
app[web.1]: Started GET "/admin" for 79.157.xx.xx at 2011-08-24 12:15:52 +0000
app[web.1]: 
app[web.1]: ActionController::RoutingError (No route matches {:controller=>"home"}):
heroku[router]: GET appname.herokuapp.com/admin dyno=web.1 queue=0 wait=0ms service=7ms status=404 bytes=728
app[web.1]:   app/controllers/application_controller.rb:5:in `block in <class:ApplicationController>'
app[web.1]: 
app[web.1]: 
app[web.1]: cache: [GET /admin] miss
app[web.1]:   Processing by RailsAdmin::MainController#index as HTML
app[web.1]: Completed 404 Not Found in 2ms


所有其他路线(基本上设计路线)都可以正常工作。

在本地机器上运行 Thin 生产环境(我在 Heroku 中使用的网络服务器)时,我得到了相同的结果:

$ bundle exec rails server thin -e production
=> Booting Thin
=> Rails 3.1.0.rc6 application starting in production on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
Sprockets::Environment#static_root is deprecated
>> Thin web server (v1.2.11 codename Bat-Shit Crazy)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop

cache: [GET /admin] miss


Started GET "/admin" for 127.0.0.1 at 2011-08-24 13:49:42 +0200
  Processing by RailsAdmin::MainController#index as HTML
Completed 404 Not Found in 3ms

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

Rendered /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/actionpack-3.1.0.rc6/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.9ms)


在浏览器上

Routing Error

No route matches {:controller=>"home"}


这是我的路线.rb

root :to => "home#index"
devise_for :users
resources :users, :only => :show
mount RailsAdmin::Engine => '/admin', :as => 'rails_admin'


初始化程序/rails_admin.rb

RailsAdmin.config do |config|
  config.authorize_with :cancan
  config.reload_between_requests = false
end


这里是heroku上的路线

$ heroku run rake routes
Running rake routes attached to terminal... up, run.8
                    root        /                              {:controller=>"home", :action=>"index"}
        new_user_session GET    /users/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session GET    /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
                    user GET    /users/:id(.:format)           {:action=>"show", :controller=>"users"}
             rails_admin        /admin                         {:to=>RailsAdmin::Engine}


最后是本地路线......同样!

$ rake routes
                    root        /                              {:controller=>"home", :action=>"index"}
        new_user_session GET    /users/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session GET    /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)               {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
                    user GET    /users/:id(.:format)           {:action=>"show", :controller=>"users"}
             rails_admin        /admin                         {:to=>RailsAdmin::Engine}


知道为什么 rails_admin 路由在开发中有效,但在生产中无效,我可以做些什么来解决这个问题?



如果有帮助,当我在生产中运行 WEBrick 时,它会失败并显示

$ rails s production
Exiting
/home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:237:in `require': no such file to load -- rack/handler/production (LoadError)
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:237:in `block in require'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:223:in `block in load_dependency'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:636:in `new_constants_in'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:223:in `load_dependency'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:237:in `require'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/rack-1.3.2/lib/rack/handler.rb:63:in `try_require'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/rack-1.3.2/lib/rack/handler.rb:16:in `get'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/rack-1.3.2/lib/rack/server.rb:269:in `server'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/railties-3.1.0.rc6/lib/rails/commands/server.rb:59:in `start'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/railties-3.1.0.rc6/lib/rails/commands.rb:54:in `block in <top (required)>'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/railties-3.1.0.rc6/lib/rails/commands.rb:49:in `tap'
    from /home/mccoy/.rvm/gems/ruby-1.9.2-p290@talleres-r31/gems/railties-3.1.0.rc6/lib/rails/commands.rb:49:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

但我认为这更像是我这边的 gem / config 问题,而不是任何相关的问题。不过可以在开发环境中正常工作。

【问题讨论】:

  • 您是否尝试过在开发中使用 Thin 来查看它是否有效?这可能是瘦特定的问题,而不是环境问题。
  • 此外,rake routes 的输出可能有助于调试问题。您应该将其添加到您的问题中。
  • Thin 在开发中确实有效。我已经从 heroku 和本地添加了rake routes 到问题中,本来打算这样做但在收集所有输出时忘记了:) 谢谢!
  • 您确定要推送到正确的遥控器吗?上次更改heroku堆栈时发生在我身上......
  • 是的,我确定,我在从推送中获得http://appname.herokuapp.com deployed to Heroku 后立即进行了测试。为了以防万一,我在部署后也尝试了heroku restart。这个应用程序是在 cedar 堆栈中新创建的,因此也不会与堆栈开关混淆。

标签: ruby-on-rails heroku rails-admin


【解决方案1】:

经过进一步(并且非常痛苦)的调查,我发现这是由 cancan 而不是 rails_admin 引起的。

生产数据库中的测试用户没有分配正确的角色,因此无权访问 rails_admin。这引发了相应的 AccessDenied 异常,该异常在 application_controller.rb 中由

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

但由于某种原因,redirect_to root_url 因上述路由错误而失败。在阅读了这个未解决的问题https://github.com/ryanb/cancan/issues/443

之后,似乎我不是唯一一个遇到这个问题的人

开发数据库中的测试用户具有正确的角色,并且可以正确访问 rails_admin,这让调试变得非常令人沮丧。

至少现在我在正确的道路上!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2016-11-05
    • 2011-08-20
    相关资源
    最近更新 更多