我需要接下来的3条路线:
get "", to: redirect("/#{I18n.locale}")
get '/:locale/', to: "home#index"
get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false
在这种情况下,当我转到domain.com
时,它会将我重定向到domain.com/en
。没关系。但是当我输入domain.com/feed
时会出现错误。我该如何解决这个错误?
我可以写这样的东西
if params[:locale] == "en"
get "", to: redirect("/#{I18n.locale}")
get '/:locale/', to: "home#index"
else
get "/*path", to: redirect("/#{I18n.default_locale}/%{path}", status: 302), constraints: {path: /(?!(#{I18n.available_locales.join("|")})\/).*/}, format: false
end
还是其他什么?
错误:
"feed" is not a valid locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
答案 0 :(得分:0)
你必须"约束"首先是区域设置路由,否则它将捕获所有路由。所以做一些像
这样的事情get '/:locale/', to: "home#index", constraints: {locale: /en|de/}
请参阅documentation,您可以提供正则表达式来约束路线,在这种情况下:只允许en
和de
区域设置。
如果您的语言环境列表很长并且将来可能会发生变化,这会变得乏味,所以您也可以写一下:
get '/:locale/', to: "home#index", constraints: {locale: /#{I18n.available_locales.join("|")}/ }