我在使用 Devise 的 RoR 应用程序中添加了 I18n,如果我尝试重置密码,现在会收到错误消息。错误是:
Routing Error
No route matches {:action=>"edit", :controller=>"devise/passwords", :reset_password_token=>"uMopWesaxczNn2cdePUQ"}
如何正确设置我的 Devise 路由以考虑 I18n?
routes.rb
scope ":locale", locale: /#{I18n.available_locales.join("|")}/ do
devise_for :users, path_names: {sign_in: "login", sign_out: "logout"},
controllers: {omniauth_callbacks: "omniauth_callbacks"}
root to: 'static_pages#home'
end
match '*path', to: redirect {|params| "/#{I18n.default_locale}/#{CGI::unescape(params[:path])}" }, constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }
match '', to: redirect("/#{I18n.default_locale}")
application_controller.rb
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] if params[:locale].present?
end
def default_url_options(options = {})
{locale: I18n.locale}
end
最佳答案
我确实创建了一个 sample app正是针对这种情况(设计+国际化)。自从我创建该应用程序以来已经有一段时间了,它可能有一些小错误/不完整,但关键是使用带括号的可选范围。
当你没有 :locale
变量集时,你的代码 devise_for :users
没有定义问题(这是我从你的错误中猜测的,重定向代码在你的路线可能不工作 - 你真的不需要那个,我没有测试过,但我不认为这是一个好习惯)。此外,这就是为什么它试图将 token 值分配为 :locale
变量。
相反,您需要使用括号。因此 :locale
将是可选的,并且当未设置 :locale
时,您的路由定义将保持有效。
scope "(:locale)", :locale => /en|tr/ do
devise_for :users
root :to => "main#index"
end
希望对你有帮助。
关于ruby-on-rails - Devise and I18n - 重置密码路由问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900085/