2012-07-25 109 views
2

我想为我的路线做一个简单的语言翻译,但我真的不明白为什么我的方法不工作。我想致电www.example.com/it/camere致电rooms_path(locale: :it)www.example.com/en/rooms致电rooms_path(locale: :en)
例如,看看下面的路线:在Rails中翻译路线

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! 

有人可以向我解释为什么会发生这种情况吗?
我已经阅读了大约3次有关路由的Rails文章,但它没有帮助。

谢谢!

P.S.我宁愿不使用插件为了学习:)

编辑:

这是我的就是我获得通过调用耙路线:

rooms GET /:locale/rooms(.:format) home#rooms {:locale=>"en"} 
rooms GET /:locale/camere(.:format) home#rooms {:locale=>"it"} 
root   /(:locale)(.:format)  home#index 

回答

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

+0

天哪,我怀疑这个。我认为我可以用不同的约束条件调用相同的url助手。任何其他方式来实现我的结果没有插件?我可以使用两个不同的帮手,但是我会忽略在我的视图中调用'rooms_path(...)'的好处。我对吗?谢谢。 – StockBreak 2012-07-25 18:55:59