ruby-on-rails - Devise and I18n - 重置密码路由问题

标签 ruby-on-rails ruby-on-rails-3 internationalization routing devise

我在使用 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/

相关文章:

ruby-on-rails - 回形针回调或简单的处理器?

ruby-on-rails - 您如何覆盖 Rails has_one 关联的 getter 方法?

java - 如何从语言中获取本地国家?

ruby-on-rails - 在 I18n 插值中使用另一个 I18n 键

objective-c - 使用 Nibs 进行国际化。这真的是个好主意吗?

ruby-on-rails - RailsAdmin - 定制你自己的过滤器

ruby-on-rails - 在 Rails for Heroku 中将 URL 从子目录重写为子域

ruby-on-rails - 在Rails 4.0.4应用中找不到文件 'turbolinks'

ruby-on-rails - 为什么我不能在我的 Rails 应用程序中使用 Gmail 正确设置 FROM 名称?

ruby-on-rails - 在 Gemfile 中使用 'gemspec' 时,我该怎么做 :require => 'foo'