2011-08-24 58 views
3

我有一個非常基本的Rails 3.1rc6應用程序,基本上只有Devise,CanCan和rails_admin,以及一些非常簡單的模型。rails_admin在開發中但不在生產或heroku

在開發環境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 


所有其他途徑(設計基本路線),做工精細。

當運行在生產薄在我的本地機器(我在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/[email protected]/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/[email protected]/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/[email protected]/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:237:in `block in require' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:223:in `block in load_dependency' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:636:in `new_constants_in' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:223:in `load_dependency' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/activesupport-3.1.0.rc6/lib/active_support/dependencies.rb:237:in `require' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/rack-1.3.2/lib/rack/handler.rb:63:in `try_require' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/rack-1.3.2/lib/rack/handler.rb:16:in `get' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/rack-1.3.2/lib/rack/server.rb:269:in `server' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/railties-3.1.0.rc6/lib/rails/commands/server.rb:59:in `start' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/railties-3.1.0.rc6/lib/rails/commands.rb:54:in `block in <top (required)>' 
    from /home/mccoy/.rvm/gems/[email protected]/gems/railties-3.1.0.rc6/lib/rails/commands.rb:49:in `tap' 
    from /home/mccoy/.rvm/gems/[email protected]/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>' 

但我認爲這是在我身邊比什麼寶石/配置問題有關。儘管與開發環境很好地協作。

+0

您是否嘗試過在開發中使用Thin來查看它是否有效?這可能是一個薄而不是環境問題的特定問題。 – Fabio

+0

此外,'rake routes'的輸出可能對調試問題有用。你應該把它添加到你的問題。 – Fabio

+0

薄確實在開發中工作。 我已經從heroku和local的'rake routes'添加了這個問題,這意味着要做到這一點,但在收集所有輸出時忘記了:)謝謝! – tomtastico

回答

2

經過進一步(也是非常痛苦的)調查後,我發現這是由cancan而不是rails_admin引起的。

生產數據庫中的測試用戶沒有分配正確的角色,因此未授權訪問rails_admin。這投擲了在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,這使得調試非常令人沮喪。

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

相關問題