首页 文章

Ruby on Rails:url_for:back导致back_url的NoMethodError

提问于
浏览
2

我正在尝试使用url_for(:back)创建一个重定向,在用户登录时返回上一页 .

当用户只是自己进入登录页面时,我已经成功地工作了 . 但是,当用户由于访问要求用户进行身份验证的页面而被重定向到登录页面时,重定向会将用户发送回页面,然后他/她尝试访问权限不足的用户 .

我正在尝试修改我的登录控制器操作以正确处理重定向 . 我的计划是在发生强制重定向时使用查询字符串参数“redirect” . 在控制器中,如果该参数存在,则使用该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"}

请记住,我之前已经开始工作了 - 在添加此逻辑之前,url_for(:back)知道如何正常运行 .

提前感谢任何想法!

2 回答

  • 1

    您正尝试在控制器中使用视图助手方法 . 您期望的行为驻留在ActionView :: Helpers :: UrlHelper中,但您调用的方法是在ActionController :: Base中 . 不幸的是,两种方法的名称相同,功能非常相似,但不完全相同 .

    为了快速修复,ActionController :: Base设置了一个 @template 变量,该变量可以访问所有ActionView帮助程序 . 尝试从该对象调用 url_for ,如下所示:

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

    然而,我是'm not sure that'的方式来做到这一点 . 如果rails开发人员希望我们无所不知地使用 @template 变量,他们会更多地宣传它 .

    获取原始引荐来源的URL的另一种方法(后面是你正在寻找的)是使用 request 方法:

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

    在我的情况下,有时候:返回指向我要离开的同一个地方,这样就会发生循环 . 我的解决方案是: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上

相关问题