设计和I18n - 重置密码路由问题

dia*_*ks2 2 routing ruby-on-rails internationalization devise ruby-on-rails-3

我将I18n添加到我使用Devise的RoR应用程序中,如果我尝试重置密码,我现在收到错误.错误是:

Routing Error
No route matches {:action=>"edit", :controller=>"devise/passwords", :reset_password_token=>"uMopWesaxczNn2cdePUQ"} 
Run Code Online (Sandbox Code Playgroud)

如何才能正确设置我的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}")
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Alp*_*nar 8

我确实为这种情况创建了一个示例应用程序(设计+国际化).自从我创建该应用程序以来,它已经是时间了,可能它有点错误/不完整,但关键点是使用带括号的可选范围.

devise_for :users当你没有:locale变量集时,代码的问题没有定义(这是我猜错你的路线中的重定向代码可能不起作用 - 你真的不需要那个,我没有测试过,但我不认为这是一个很好的做法).此外,这就是为什么它试图将标记值分配为:locale变量.

相反,您需要使用括号.因此,这:locale将是可选的,并且:locale未设置时路由定义将保持有效.

scope "(:locale)", :locale => /en|tr/ do
  devise_for :users
  root :to => "main#index"
end
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助.