我想使用以下行重定向路径中的路径:
get 'privacy_policy',:controller => :pages,:as => 'privacy_policy' get 'privacypolicy.PHP' => redirect(privacy_policy_url)
这样/privacypolicy.PHP就会被重定向到正上方定义的正确页面.
但是,它抛出以下错误:
undefined local variable or method `privacy_policy_url'
所以我猜测不能在routes.rb中使用URL助手.有没有办法在路由文件中使用URL帮助程序,是否可以这样做?
解决方法
我知道我在这里有点晚了,但这个问题是谷歌搜索“在routes.rb中使用url_helpers”时最热门的一个问题,我最初在遇到这个问题时发现它,所以我想分享一下我的解决方案
正如@martinjlowm在他的回答中提到的那样,在绘制新路线时不能使用URL助手.但是,有一种方法可以使用URL帮助程序定义重定向路由规则.问题是,ActionDispatch::Routing::Redirection#redirect可以采用一个块(或一个#call-able),后者(当用户点击路径时)调用两个参数params和request,以返回一个新的路由,一个字符串.并且因为在那一刻正确绘制了路径,所以在块内调用URL助手是完全有效的!
get 'privacypolicy.PHP',to: redirect { |_params,_request| Rails.application.routes.url_helpers.privacy_policy_path }
此外,我们可以使用Ruby元编程工具来添加一些糖:
class UrlHelpersRedirector def self.method_missing(method,*args,**kwargs) # rubocop:disable Style/MethodMissing new(method,args,kwargs) end def initialize(url_helper,kwargs) @url_helper = url_helper @args = args @kwargs = kwargs end def call(_params,_request) url_helpers.public_send(@url_helper,*@args,**@kwargs) end private def url_helpers Rails.application.routes.url_helpers end end # ... Rails.application.routes.draw do get 'privacypolicy.PHP',to: redirect(UrlHelperRedirector.privacy_policy_path) end