Vin*_*ent 7 ruby-on-rails friendly-id globalize3 globalize ruby-on-rails-4.2
过去几个小时我一直在摸不着头脑,寻找答案,但我找不到任何地方.
我的宝石文件:
# Use globalize for translating models
gem "globalize", github: "ncri/globalize" # for Rails 4.2
gem 'globalize-accessors', '~> 0.1.5'
# Use friendly_id for slugs
gem 'friendly_id', '~> 5.1.0'
gem 'friendly_id-globalize', '~> 1.0.0.alpha1'
Run Code Online (Sandbox Code Playgroud)
情况如下:
我有两种语言"en"和"fr"
2个模型:pages和pages_translations页面有一个slug列,pages_translations也有一个slug列.
如果我查看页面 - > en/pages/slug-en,它可以工作.
如果我查看页面 - > fr/pages-slug-fr,它可以工作.
所以我假设friendly_id和globalize已正确配置.
但是我的问题是我不能使用以下语言切换器:
<% if I18n.locale != :en %>
<li>
<%= link_to t('menu.languages.short_en'), url_for(locale: 'en') %>
</li>
<% end %>
Run Code Online (Sandbox Code Playgroud)
路线变为en/pages/slug-fr(即语言改变但不是slug).
我在初始化程序中激活了config.use:finders.
我的页面模型:
translates :title, :slug, :blurb, :content, :seo_title, :seo_description, :seo_keywords
globalize_accessors :locales => [:en, :fr], :attributes => [:title, :slug, :blurb, :content, :seo_title, :seo_description, :seo_keywords]
extend FriendlyId
friendly_id :slug, :use => :globalize
validates :slug, presence: true, uniqueness: { case_sensitive: false }
Run Code Online (Sandbox Code Playgroud)
那么我需要做些什么才能在我的语言切换器上找到合适的路径?理想情况下,我希望这适用于任何模型,而不仅仅是Page模型.
谢谢! - 文森特
我相信你url_for的全局布局中有不同的控制器。在这种情况下,您必须在每个控制器中设置某些记录(您可以制作助手或将所有内容移至路由器/中间件级别)。url_for(page)必须运行I18n.with_locale并且可能需要https://github.com/norman/friend_id-globalize。
可以在这里找到更多信息:https://github.com/norman/Friendly_id-globalize/issues/7和http://www.cantierecreativo.net/blog/2015/02/10/alternate-sitemap/(在一些语言,但示例可以帮助您理解整个概念)。
长话短说
# app/views/layouts/application.html.slim
ul.switch_locale
- I18n.available_locales.each do |locale|
li= I18n.with_locale(locale) do
- url = yield(:current_page_url) || url_for(locale: locale)
= link_to "Switch to #{locale}", url
# app/views/posts/show.html.slim
- content_for(:current_page_url) { post_url(@post) }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
824 次 |
| 最近记录: |