Ruby on rails 3.2 Rails 3.2路由:多个默认值

Ruby on rails 3.2 Rails 3.2路由:多个默认值,ruby-on-rails-3.2,routing,defaults,Ruby On Rails 3.2,Routing,Defaults,我在路线中使用两个默认参数: scope '(/:locale)(/:currency)', currency: /eur|usd/, locale: /de|en/, defaults: { currency: 'eur' } do ... 因为货币应该用于整个访问,所以我在ApplicationController中的默认_url_选项中添加了区域设置和货币: def default_url_options options = {} { locale: I18n.locale, curr

我在路线中使用两个默认参数:

scope '(/:locale)(/:currency)', currency: /eur|usd/, locale: /de|en/, defaults: { currency: 'eur' } do ...
因为货币应该用于整个访问,所以我在ApplicationController中的默认_url_选项中添加了区域设置和货币:

def default_url_options options = {}
 { locale: I18n.locale, currency: params['currency'] }
end
当我生成url时,即使用url_for()时,Rails默认忘记了货币。它只在我手动添加它时起作用。例如:

root_path(currency: params['currency'])
我希望这是默认添加(当然)。语言环境没有问题。Rails正确地处理了这个问题。(也许是因为全球宝石?)


谢谢你的帮助

映射路由时,路由声明中的默认值存储在散列中。当您调用route helper
foo_path
时,这些默认值将作为选项散列传递给:

现在,当我们收到一个散列时,它
reverse\u mergeurl\u选项
(其中声明了覆盖
default\u url\u选项
的默认设置!)。因为这是一个
反向合并
这意味着
选项
中的值优先于
url\u选项
中的值,因此
货币
的默认值将始终是路由文件中设置的值,而不管您在
应用程序控制器
中的
默认url\u选项
中放置了什么。然后将这些默认值传递到
方法等的
url\u链上,并返回您的路径

此外,currency参数将完全从返回的路径中删除,包括:

它确定
路径_选项中的默认值
'eur'
)与从中选择它的
默认值
(duhh?)相等,因此出于某种原因将其删除

因此,我们了解到,路由文件中的默认值始终优先于
url\u选项


因此,我的建议是从您的路由范围中删除
默认值:
键,然后您的URL中将始终有一个
:currency
参数,您可以在控制器中指定默认值。

什么版本的rails?我刚刚测试了它,它对我有效。你能把路由助手调用和上下文、结果URL和所需URI放在你的问题中吗?我收回这一点,我没有完全复制它;似乎是路由作用域的
默认值
部分把事情搞砸了,我要玩一玩。谢谢!Rails有时会将货币作为查询字符串添加到URL,即
http://domain.com/de?currency=eur
非常感谢!我真的误解了
默认值
选项。现在,我使用默认的_url_选项设置默认值(如果params[:currency]是我的默认值,则不要将其包含在链接中)。
def url_for(options = nil)
  case options
  when nil
    _routes.url_for(url_options.symbolize_keys)
  when Hash
    _routes.url_for(options.symbolize_keys.reverse_merge!(url_options))
  when String
    options
  else
    polymorphic_url(options)
  end
end
def format path_options
  path_options.delete_if do |key, value|
    value.to_s == defaults[key].to_s && !required_parts.include?(key)
  end

  Visitors::Formatter.new(path_options).accept(path.spec)
end