ruby-on-rails – 在routes.rb中访问URL帮助程序

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在routes.rb中访问URL帮助程序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想使用以下行重定向路径中的路径:
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

猜你在找的Ruby相关文章