簡體   English   中英

rails_admin在開發中工作但不在生產或heroku中

[英]rails_admin working in development but not in production or heroku

我有一個非常基本的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 in production(我在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"}


這是我的routes.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>'

但我認為這更像是一個寶石/配置問題,而不是任何相關問題。 但是在開發環境中工作得很好。

在進一步(並且非常痛苦)調查之后,我發現這是由cancan而不是rails_admin引起的。

生產數據庫中的測試用戶沒有分配正確的角色,因此無權訪問rails_admin。 這引發了在application_controller.rb中處理的相應的AccessDenied異常

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,這使得調試非常令人沮喪。

至少現在我走在正確的道路上!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM