ruby-on-rails - Ruby on Rails:url_for:back导致back_url出现NoMethodError

标签 ruby-on-rails url-for

我正在尝试使用url_for(:back)创建一个重定向,该重定向会在用户登录后返回到上一页。

当用户仅自己进入登录页面时,它已经成功运行了。但是,当由于访问需要验证用户身份的页面而将用户重定向到登录页面时,重定向将在用户尝试使用权限不足的访问之前将用户返回到该页面。

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


我得到的错误是:

UsersController#login中的NoMethodError

#的未定义方法`back_url'

RAILS_ROOT:[模糊]
应用程序跟踪|框架跟踪全迹

vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:在__send__中
vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:在`polymorphic_url'中
vendor / rails / actionpack / lib / action_controller / base.rb:628:在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:在`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:在`process'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:在`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:在`process_client'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在'initialize'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在`new'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:在'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:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:在`each'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:在`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:在__send__中
vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:在`polymorphic_url'中
vendor / rails / actionpack / lib / action_controller / base.rb:628:在url_for中
vendor / rails / actionpack / lib / action_controller / base.rb:1256:在'发送'中
vendor / rails / actionpack / lib / action_controller / base.rb:1256:in`perform_action_without_filters'中
vendor / rails / actionpack / lib / action_controller / filters.rb:617:在`call_filters'中
vendor / rails / actionpack / lib / action_controller / filters.rb:610:在'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:在`measure'中
vendor / rails / actionpack / lib / action_controller / benchmarking.rb:68:in`perform_action_without_rescue'
vendor / rails / actionpack / lib / action_controller / rescue.rb:136:在`perform_action_without_caching'中
vendor / rails / actionpack / lib / action_controller / caching / sql_cache.rb:13:在'perform_action'中
vendor / rails / activerecord / lib / active_record / connection_adapters / abstract / query_cache.rb:34:在“缓存”中
vendor / rails / activerecord / lib / active_record / query_cache.rb:8:在“缓存”中
vendor / rails / actionpack / lib / action_controller / caching / sql_cache.rb:12:在'perform_action'中
vendor / rails / actionpack / lib / action_controller / base.rb:524:在'发送'中
vendor / rails / actionpack / lib / action_controller / base.rb:524:在`process_without_filters'中
vendor / rails / actionpack / lib / action_controller / filters.rb:606:在`process_without_session_management_support'中
vendor / rails / actionpack / lib / action_controller / session_management.rb:134:在“进程”中
vendor / rails / actionpack / lib / action_controller / base.rb:392:在'process'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:184:在`handle_request'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:112:在`dispatch_unlocked'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:125:在`dispatch'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:在“同步”中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:在`dispatch'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:134:在`dispatch_cgi'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:41:在`dispatch'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:142:在`load_without_new_constant_marking'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:142:在'load'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:521:in`new_constants_in'
vendor / rails / activesupport / lib / active_support / dependencies.rb:142:在'load'中
供应商/rails/railties/lib/commands/servers/mongrel.rb:64
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在`gem_original_require'中
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在'require'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:153:在'require'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:521:in`new_constants_in'
vendor / rails / activesupport / lib / active_support / dependencies.rb:153:在'require'中
供应商/rails/railties/lib/commands/server.rb:49
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在`gem_original_require'中
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在'require'中
脚本/服务器:3

vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:在__send__中
vendor / rails / actionpack / lib / action_controller / polymorphic_routes.rb:112:在`polymorphic_url'中
vendor / rails / actionpack / lib / action_controller / base.rb:628:在url_for中
app / controllers / users_controller.rb:16:in`login'
vendor / rails / actionpack / lib / action_controller / base.rb:1256:在'发送'中
vendor / rails / actionpack / lib / action_controller / base.rb:1256:in`perform_action_without_filters'中
vendor / rails / actionpack / lib / action_controller / filters.rb:617:在`call_filters'中
vendor / rails / actionpack / lib / action_controller / filters.rb:610:在'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:在`measure'中
vendor / rails / actionpack / lib / action_controller / benchmarking.rb:68:in`perform_action_without_rescue'
vendor / rails / actionpack / lib / action_controller / rescue.rb:136:在`perform_action_without_caching'中
vendor / rails / actionpack / lib / action_controller / caching / sql_cache.rb:13:在'perform_action'中
vendor / rails / activerecord / lib / active_record / connection_adapters / abstract / query_cache.rb:34:在“缓存”中
vendor / rails / activerecord / lib / active_record / query_cache.rb:8:在“缓存”中
vendor / rails / actionpack / lib / action_controller / caching / sql_cache.rb:12:在'perform_action'中
vendor / rails / actionpack / lib / action_controller / base.rb:524:在'发送'中
vendor / rails / actionpack / lib / action_controller / base.rb:524:在`process_without_filters'中
vendor / rails / actionpack / lib / action_controller / filters.rb:606:在`process_without_session_management_support'中
vendor / rails / actionpack / lib / action_controller / session_management.rb:134:在“进程”中
vendor / rails / actionpack / lib / action_controller / base.rb:392:在'process'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:184:在`handle_request'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:112:在`dispatch_unlocked'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:125:在`dispatch'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:在“同步”中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:124:在`dispatch'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:134:在`dispatch_cgi'中
vendor / rails / actionpack / lib / action_controller / dispatcher.rb:41:在`dispatch'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:在`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:在`process'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:在`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:在`process_client'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在'initialize'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在`new'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:在'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:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:282:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:在`each'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/configurator.rb:281:在`run'中
/var/lib/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:在`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:在`load_without_new_constant_marking'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:142:在'load'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:521:in`new_constants_in'
vendor / rails / activesupport / lib / active_support / dependencies.rb:142:在'load'中
供应商/rails/railties/lib/commands/servers/mongrel.rb:64
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在`gem_original_require'中
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在'require'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:153:在'require'中
vendor / rails / activesupport / lib / active_support / dependencies.rb:521:in`new_constants_in'
vendor / rails / activesupport / lib / active_support / dependencies.rb:153:在'require'中
供应商/rails/railties/lib/commands/server.rb:49
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在`gem_original_require'中
/usr/lib/ruby/1.8/rubygems/custom_require.rb:31:在'require'中
脚本/服务器:3

请求

参数:

没有

显示会话转储

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


响应

标头:

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

请记住,我之前已经开始使用它-url_for(:back)在添加此逻辑之前就知道如何正常运行。

预先感谢您的任何想法!

最佳答案

您正在尝试在控制器中使用视图帮助器方法。您期望的行为驻留在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


但是,我不确定这是否是“正确”的方法。如果Rails开发人员希望我们全力使用@template变量,他们会做更多的广告。

将URL获取到原始引荐来源网址(您正在查找的:back)的另一种方法是使用request方法:

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

关于ruby-on-rails - Ruby on Rails:url_for:back导致back_url出现NoMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2909584/

相关文章:

ruby-on-rails-3 - 调用 expire_fragment 引发 "to use #url_for, you must include routing helpers explicitly"错误

ruby - 从数组或对象(而不是散列)生成路由时,如何将 `only_path: true` 和 `anchor:` 等选项传递给 `url_for`

ruby-on-rails - 如何在 Stack Overflow 或 Quora 上创建标签系统

html - Ruby on Rails 4. 在任何页面上选择所有 HTML 输入

javascript - ember 模板无法在 Rails 应用程序中呈现的最常见原因

ruby-on-rails - 多个 Controller 中方法的 Rails 约定

go - 如何在模板内的urlfor函数中选择模块名称

ruby-on-rails - rails redirect_to :back with anchor not working

flask - Flask 的 url_for 对查询字符串有字符串限制吗?

ruby-on-rails - rails 3.2 : Routing helpers in views break locally after other error