【问题标题】:Add default params to named route helper in rails将默认参数添加到 rails 中的命名路由助手
【发布时间】:2021-02-20 09:27:39
【问题描述】:

我有这条路线

get "/articles/:id" => "articles#show", as: :article

生成路径助手article_path(article)

是否可以为这个路径助手添加一些默认参数,比如/articles/123?token=123456?例如,我多次使用 article_path 助手,总是做类似的事情会很乏味

<%= article_path(article, token: article.token) %>

我已经尝试过使用默认路由,但这不会影响 URL 生成,当我在此路由上时只会影响 params 对象

get "/articles/:id" => "articles#show", as: :article, defaults: { token: "my token" }

我唯一能想到的就是覆盖/猴子补丁助手,但由于我也需要其他助手上的这个逻辑,我想知道是否有构建方法来做到这一点。

【问题讨论】:

  • 简而言之 - 没有。查询字符串参数对 rails 中的路由是透明的。实现这一点的方法是编写自己的辅助方法,该方法只需添加额外的哈希参数并调用 super。

标签: ruby-on-rails ruby routes


【解决方案1】:

这个逻辑并不真正属于路由层,查询字符串参数大部分对路由器完全透明。

相反,您可以创建自己的辅助方法:

def article_path(article_or_id, **opts)
  if opts[:token].nil? && article_or_id.respond_to?(:token)
    super(article_or_id, opts.merge(token: article.token))
  else
    super
  end
end

【讨论】:

  • 感谢您的回答!快速跟进:我想从定义了它自己的帮助器模块TokenRoutes.helpers 的类中定义加载帮助器。如何将此帮助程序加载到视图/路由帮助程序中?
  • “助手”实际上只是包含在控制器和视图上下文中的一堆模块。在这里使用类没有意义。
  • 一个类就像一个装饰器,你将视图上下文传递给初始化器来装饰模型实例。有很多关于这方面的教程。
  • TokenRoutes.helpers is 是基于某种逻辑生成的模块。所以问题是,我如何加载这些帮助程序以便它们覆盖 url 帮助程序?我可以手动将它们放在app/helpers 目录中,但是我必须将逻辑拆分为两个单独的位置。我还尝试通过ActiveSupport.on_load(:action_view) { prepend TokenRoutes.helpers } 将其加载到初始化程序中。但似乎 url 助手是在 on_load 回调之后创建的,因此它们会覆盖我的助手,而不是相反。
猜你喜欢
  • 2012-04-02
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多