Rails中的路由冲突

时间:2015-06-10 11:42:45

标签: ruby-on-rails routing

我需要接下来的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

1 个答案:

答案 0 :(得分:0)

你必须"约束"首先是区域设置路由,否则它将捕获所有路由。所以做一些像

这样的事情
get '/:locale/', to: "home#index", constraints: {locale: /en|de/} 

请参阅documentation,您可以提供正则表达式来约束路线,在这种情况下:只允许ende区域设置。

如果您的语言环境列表很长并且将来可能会发生变化,这会变得乏味,所以您也可以写一下:

get '/:locale/', to: "home#index", constraints: {locale: /#{I18n.available_locales.join("|")}/ }