我正在尝试为我的路线进行简单的语言翻译,但我真的不明白为什么我的方法不起作用。我希望通过拨打www.example.com/it/camere
和rooms_path(locale: :it)
致电www.example.com/en/rooms
来获得rooms_path(locale: :en)
。
例如,请查看以下路线:
get ":locale/rooms" => "home#rooms", constraints: { locale: "en" }, as: "rooms"
get ":locale/camere" => "home#rooms", as: "rooms"
我得到以下结果:
app.rooms_path # => error OK
app.rooms_path(locale: "it") # => 'it/camere' OK
app.rooms_path(locale: "en") # => 'en/camere' Why?!?
使用以下路线(注意第二个约束):
get ":locale/rooms" => "home#rooms", constraints: { locale: "en" }, as: "rooms"
get ":locale/camere" => "home#rooms", constraints: { locale: "it" }, as: "rooms"
我得到以下结果:
app.rooms_path # => error OK
app.rooms_path(locale: "it") # => 'it/camere' OK
app.rooms_path(locale: "en") # => error Lol?!? This is weird!
有人可以向我解释为什么会发生这种情况吗? 我已经阅读了Rails关于路由的文章的3倍,但它没有帮助。
谢谢!
P.S。我希望不要使用插件来学习:)
修改
这是我通过调用rake路线得到的:
rooms GET /:locale/rooms(.:format) home#rooms {:locale=>"en"}
rooms GET /:locale/camere(.:format) home#rooms {:locale=>"it"}
root /(:locale)(.:format) home#index
答案 0 :(得分:0)
关于第一个案例
您不能使用相同名称的:as
两次。第二次使用它取代了之前的xxx_path
定义,您最终得到的rooms_path
指向:locale/camere
,没有任何约束。看起来你已经高估了Rails'魔法。
关于第二种情况
get ":locale/camere" => "home#rooms", constraints: { locale: "it" }, as: "rooms"
无法拨打app.rooms_path(locale: "en")
,因为只有一个rooms_path
可用且预计:locale
为"it"
。用"en"
调用它自然会导致一条未解决的路线抱怨。
如果您想查看其来源,请查看define_url_helper。