2010-05-26 113 views
2

我試圖使用url_for(:背面)。創建一個重定向在根據用戶的登錄導致回到以前的頁面Ruby on Rails的:url_for:回導致NoMethodError爲back_url

我有它可以在用戶剛剛進入登錄頁面時成功運行。但是,當用戶由於訪問要求用戶通過身份驗證的頁面而被重定向到登錄頁面時,重定向會在用戶嘗試訪問權限不足之前將用戶發送回頁面。

我試圖修改我的登錄控制器操作來正確處理重定向。我的計劃是在發生強制重定向時使用查詢字符串參數「重定向」。在控制器中,如果該參數存在,則使用該URL;否則,使用url_for(:back),或者如果這不起作用(由於缺乏HTTP_REFERER),那麼用戶將被重定向到該站點的主頁。

這裏是一個應該實現這個邏輯的代碼片段:

if params[:redirect] 
    @url = params[:redirect] 
else 
    @url = url_for :back 
    @url ||= url_for :controller => "home", :action => "index" 
end 

我得到的錯誤是:

NoMethodError in UsersController#login 

undefined method `back_url' for # 

RAILS_ROOT: [obscured] 
Application Trace | Framework Trace | Full Trace 

vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:112:in `__send__' 
vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:112:in `polymorphic_url' 
vendor/rails/actionpack/lib/action_controller/base.rb:628:in `url_for' 
app/controllers/users_controller.rb:16:in `login' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `each' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb:212:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281 

vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:112:in `__send__' 
vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:112:in `polymorphic_url' 
vendor/rails/actionpack/lib/action_controller/base.rb:628:in `url_for' 
vendor/rails/actionpack/lib/action_controller/base.rb:1256:in `send' 
vendor/rails/actionpack/lib/action_controller/base.rb:1256:in `perform_action_without_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:617:in `call_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark' 
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure' 
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
vendor/rails/actionpack/lib/action_controller/rescue.rb:136:in `perform_action_without_caching' 
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in `perform_action' 
vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache' 
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in `perform_action' 
vendor/rails/actionpack/lib/action_controller/base.rb:524:in `send' 
vendor/rails/actionpack/lib/action_controller/base.rb:524:in `process_without_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:606:in `process_without_session_management_support' 
vendor/rails/actionpack/lib/action_controller/session_management.rb:134:in `process' 
vendor/rails/actionpack/lib/action_controller/base.rb:392:in `process' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:184:in `handle_request' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:112:in `dispatch_unlocked' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:125:in `dispatch' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:124:in `synchronize' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:124:in `dispatch' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:134:in `dispatch_cgi' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:41:in `dispatch' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:142:in `load_without_new_constant_marking' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:142:in `load' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:142:in `load' 
vendor/rails/railties/lib/commands/servers/mongrel.rb:64 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:153:in `require' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:153:in `require' 
vendor/rails/railties/lib/commands/server.rb:49 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require' 
script/server:3 

vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:112:in `__send__' 
vendor/rails/actionpack/lib/action_controller/polymorphic_routes.rb:112:in `polymorphic_url' 
vendor/rails/actionpack/lib/action_controller/base.rb:628:in `url_for' 
app/controllers/users_controller.rb:16:in `login' 
vendor/rails/actionpack/lib/action_controller/base.rb:1256:in `send' 
vendor/rails/actionpack/lib/action_controller/base.rb:1256:in `perform_action_without_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:617:in `call_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:610:in `perform_action_without_benchmark' 
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
/usr/lib/ruby/1.8/benchmark.rb:293:in `measure' 
vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' 
vendor/rails/actionpack/lib/action_controller/rescue.rb:136:in `perform_action_without_caching' 
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in `perform_action' 
vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache' 
vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in `perform_action' 
vendor/rails/actionpack/lib/action_controller/base.rb:524:in `send' 
vendor/rails/actionpack/lib/action_controller/base.rb:524:in `process_without_filters' 
vendor/rails/actionpack/lib/action_controller/filters.rb:606:in `process_without_session_management_support' 
vendor/rails/actionpack/lib/action_controller/session_management.rb:134:in `process' 
vendor/rails/actionpack/lib/action_controller/base.rb:392:in `process' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:184:in `handle_request' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:112:in `dispatch_unlocked' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:125:in `dispatch' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:124:in `synchronize' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:124:in `dispatch' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:134:in `dispatch_cgi' 
vendor/rails/actionpack/lib/action_controller/dispatcher.rb:41:in `dispatch' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `each' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb:212:in `run' 
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281 
vendor/rails/activesupport/lib/active_support/dependencies.rb:142:in `load_without_new_constant_marking' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:142:in `load' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:142:in `load' 
vendor/rails/railties/lib/commands/servers/mongrel.rb:64 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:153:in `require' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:521:in `new_constants_in' 
vendor/rails/activesupport/lib/active_support/dependencies.rb:153:in `require' 
vendor/rails/railties/lib/commands/server.rb:49 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:in `require' 
script/server:3 

Request 

Parameters: 

None 

Show session dump 

--- 
:user: 
:csrf_id: 2927cca61bbbe97218362b5bcdb74c0f 
flash: !map:ActionController::Flash::FlashHash {} 


Response 

Headers: 

{"Content-Type"=>"", 
"cookie"=>[], 
"Cache-Control"=>"no-cache"}

記住,我是有工作earlier-- url_for( :後面)知道如何在我添加這個邏輯之前正確地操作。

在此先感謝您的任何想法!

回答

2

您正試圖在控制器中使用視圖幫助器方法。您期望的行爲駐留在ActionView :: Helpers :: UrlHelper中,但您調用的方法在ActionController :: Base中。不幸的是,兩種方法命名相同,功能非常相似,但不完全相同。

快速修復,ActionController的::基地設置一個@template變量,它可以訪問所有的助手的ActionView。嘗試調用url_for從該對象,像這樣:

if params[:redirect] 
    @url = params[:redirect] 
else 
    @url = @template.url_for :back 
    @url ||= url_for :controller => "home", :action => "index" 
end 

我不知道這是「正確」的方式做到這一點,但是。如果鐵路開發商希望我們全部使用@template變量,他們會更多地宣傳它。

另一種方式來獲得的URL原始來源(在:後面你要找的)是通過request方法:

if params[:redirect] 
    @url = params[:redirect] 
else 
    @url = request.env["HTTP_REFERER"] 
    @url ||= url_for :controller => "home", :action => "index" 
end 
+0

這很有效。我現在在視圖中也有一個錯誤,也是使用url_for,但是你所說的修正了這個錯誤。謝謝:-)(+1) – 2010-05-26 03:20:13

1

在我的情況下,有時會:回指向同一個地方我想要離開,所以發生循環。我的解決辦法:在application_controller

def new_loc 
    url = request.referer.to_s 
    url == "" || url == request.url ? root_path : url 
end 

,並在控制器

@url = params[:redirect] ? params[:redirect] : new_loc 

或者對於我來說

redirect_to new_loc 

就是這樣 方法。我在Rails 5上