【问题标题】:Generate the URL for a generic path with possible options in Rails在 Rails 中使用可能的选项生成通用路径的 URL
【发布时间】:2013-07-29 13:50:37
【问题描述】:

我正在为我们的网站创建一个可自定义的导航菜单,但遇到了以下问题。

我需要为网站上的任何控制器和操作生成一个 URL,并可以选择传递参数。我能够做到前者只需简单地说:

url_for(:controller => nav[:controller_name], :action => nav[:action_name])

这非常适合将您发送到 {controller}/{action}。例如。新闻/文章

突然加入选项会改变游戏规则。现在我需要把你送到类似的地方: {controller}/{action}/{category}/{slug}/{id}

例如。新闻/文章/世界统治/montana-max-vows-revenge/12345

上面的助手将类似于以下内容:

news_article_path('world-domination', 'montana-max-vows-revenge', '12345')

由于参数的原因,我无法在原版 url_for 中复制它。

我做过的,我不太喜欢的是:

url_for(send("#{nav[:controller_name]}_#{nav[:action_name]}_path", *nav[:options]))

它使用 send 生成帮助程序,然后将其传递给 kwargs 列表。我确定肯定有更好的方法来做到这一点?

【问题讨论】:

  • 为什么只能使用url_for?为什么不直接使用 new_article_path 这样的命名路由呢?

标签: ruby-on-rails ruby ruby-on-rails-3 url-routing


【解决方案1】:

如果您能够为选项命名(为了便于阅读,请在此处分行):

url_for({
  :controller => nav[:controller_name],
  :action => nav[:action_name]
}.merge(nav[:options] || {}))

在哪里

nav = {
  :controller_name => 'news',
  :action_name => 'articles',
  :options => {
    :category => 'world-domination',
    :slug => 'montana-max-vows-revenge',
    :id => '12345'
  }
}

【讨论】:

  • 这很好用,并且不依赖于定义的命名路由,谢谢。昨天一位同事提出了这样的建议,但我担心不知道选项中的参数名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多