【问题标题】:Translating routes in Rails在 Rails 中翻译路线
【发布时间】:2012-07-25 17:59:25
【问题描述】:

我正在尝试为我的路线做一个简单的语言翻译,但我真的不明白为什么我的方法不起作用。我想通过调用rooms_path(locale: :it) 和www.example.com/en/rooms 通过调用rooms_path(locale: :en) 获得www.example.com/it/camere。
例如,查看以下路线:

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 文章,但没有帮助。

附:我宁愿不要使用插件来学习:)

编辑:

这是我通过调用 rake 路由得到的结果:

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

【问题讨论】:

    标签: ruby-on-rails routes


    【解决方案1】:

    关于第一种情况

    您不能使用相同的名称两次使用: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。

    【讨论】:

    • 天哪,我怀疑这一点。我认为我可以使用不同的约束调用相同的 url 助手。在没有插件的情况下还有其他方法可以实现我的结果吗?我可以使用两个不同的助手,但我会失去在我看来只调用rooms_path(...) 的好处。我对吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2014-05-15
    • 1970-01-01
    • 2023-04-04
    • 2012-02-10
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多