我正在尝试使用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/