加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何配置Rails路由以适应i18n

发布时间:2020-12-17 04:34:22 所属栏目:百科 来源:网络整理
导读:我正在向Rails应用程序添加国际化,并且或多或少地遵循相关的 Rails Guide和 Railscast. 我遇到了两个问题: 如何添加重定向到当前区域设置的“主页”链接.目前我有root_path链接,但由于routes.rb中的行设计用于获取未作用域的根,因此这些链接失败.这意味着ro
我正在向Rails应用程序添加国际化,并且或多或少地遵循相关的 Rails Guide和 Railscast.

我遇到了两个问题:

>如何添加重定向到当前区域设置的“主页”链接.目前我有root_path链接,但由于routes.rb中的行设计用于获取未作用域的根,因此这些链接失败.这意味着root_path始终指向默认语言环境,而不是当前语言环境.
>我已经设置好所有工作并在本地工作(除了
上面的问题)但部署到Heroku所有网址似乎都在下降
通过我的路线文件,并被其中一个捕获所有人抓住.他们在defulat下重定向到’/’
语言环境.

我的设置如下

application_controller.rb

before_filter :set_locale
def default_url_options(options = {})
  {locale: I18n.locale}
end

private
def set_locale
  I18n.locale = params[:locale] if params[:locale].present?
end

的routes.rb

scope ":locale",locale: /#{I18n.available_locales.join("|")}/  do
  all_my_routes

  # handles /valid-locale
  root to: 'home#index',as: "localized_root"
  # handles /valid-locale/fake-path
  match '*path',to: redirect { |params,request| "/#{params[:locale]}" }
end

# handles /
root to: redirect("/#{I18n.default_locale}")

# handles /bad-locale|anything/valid-path
match '/*locale/*path',to: redirect("/#{I18n.default_locale}/%{path}")

# handles /anything|valid-path-but-no-locale
match '/*path',to: redirect("/#{I18n.default_locale}/%{path}")

我的主页链接:

<%= link_to "Home",root_path %>

解决方法

经过一番来回,我最终得到了这个工作.问题是所有路线都是a)捕获的数量比我预期的要多,b)显然在开发与部署方面表现不同(为什么这应该是我不确定).

无论如何,首先我改变范围使其成为可选(注意括号):

scope "(:locale)",.....

即使没有设置语言环境,这也确保了作用域路由有效(这主要是为了处理我遇到的回调等问题).

这允许我将两个根放到线上,只保留

root to "home#index"

我删除了“handles / valid-locale / fake-path”行,这导致’/’路径出现问题.

然后在范围之后保留以下捕获全部(注意最后一个).

# handles /bad-locale|anything/valid-path
match '/*locale/*path',to: redirect("/#{I18n.default_locale}/%{path}"),constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }

# handles /
match '',to: redirect("/#{I18n.locale}")

作为一个兴趣点,我还必须更新action_mailer来处理新的本地化网址.

config.action_mailer.default_url_options = { :host => 'path.to.my.app.com',:locale => I18n.locale }

现在一切似乎都在起作用!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读