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 merge使用url\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