Ruby on rails Rails全球化+友好id

Ruby on rails Rails全球化+友好id,ruby-on-rails,friendly-id,globalize,Ruby On Rails,Friendly Id,Globalize,我对globalize和friendly_id有一个问题。这个网站有两种语言Ru和En。Gem-friendly\u-id、globalize和friendly\u-id-globalize配置并工作。如果我把俄语改成英语,一切都很好: http://127.0.0.1:3000/ru/o-saite -> http://127.0.0.1:3000/en/about-site 但当我从英语改成俄语时,我会出错: http://127.0.0.1:3000/en/about-site -

我对globalize和friendly_id有一个问题。这个网站有两种语言Ru和En。Gem-friendly\u-id、globalize和friendly\u-id-globalize配置并工作。如果我把俄语改成英语,一切都很好:

http://127.0.0.1:3000/ru/o-saite -> http://127.0.0.1:3000/en/about-site
但当我从英语改成俄语时,我会出错:

http://127.0.0.1:3000/en/about-site -> http://127.0.0.1:3000/ru/about-site
页面模型:

class Page < ActiveRecord::Base
  validates :title, :content, :slug, presence: true
  validates :slug, uniqueness: true
  validates :title, length: { minimum: 3, maximum: 255 }
  validates :content, length: { minimum: 5 }

  # globalize
  translates :title, :content, :slug

  # FriendlyId
  extend FriendlyId

  friendly_id :slug_candidates, use: [:slugged, :finders, :globalize]

  def slug_candidates
    [
      :title,
      [:title, :id]
    ]
  end

  def should_generate_new_friendly_id?
    title_changed?
  end

  def normalize_friendly_id(string)
    title.to_s.to_slug.normalize(transliterations: :russian).to_s
  end

end
页面控制器

class PagesController < ApplicationController

  before_action :load_page, only: [:show]

  def show    
  end

  private
    def load_page
      @page = Page.friendly.find(params[:id])
      redirect_to action: action_name, id: @page.friendly_id, status: 301 unless @page.friendly_id == params[:id]
    end

    def page_params
      params.require(:page).permit(:title, :content,:slug, :published)
    end

end
现在在pages/show.slim中

- content_for :change_lang do
  li
    - link = I18n.with_locale(:ru){page_path(@page, locale: 'ru')}
    = link_to 'RU', link
  li
    - link = I18n.with_locale(:en){page_path(@page, locale: 'en')}
    = link_to 'EN', link
在layouts/aplication.html.slim中

ul class='change_lang'
  - if content_for?(:change_lang)
    = yield :change_lang
  - else
    li = link_to_unless I18n.locale == :en, "EN", locale: :en
    li = link_to_unless I18n.locale == :ru, "RU", locale: :ru
还有更简约的方法。但此方法服务器挂起

我有一个一般性的答案。 如果对你有用,请现在告诉我。 如果您有一个名称空间,您可以在:shop中设置,如果不只是url\u forobj的话

在应用程序中_helper.rb

def languages(obj=nil)
    content_for(:switch_locale) do
      I18n.available_locales.each do |locale|
        I18n.with_locale(locale) do
          concat(
            if obj
             content_tag(:li, (link_to locale, url_for([:shop, obj]) ))
            else
             content_tag(:li, (link_to locale, url_for(locale: locale.to_s) ))
            end              
          )
        end
      end
    end
  end
在你看来

- languages @category
或者干脆

- languages
在application.html.erb/haml.slim中或您希望呈现翻译的任何位置。
=yield:switch_locale

我想重定向在您的控制器中,对吗?你能把它包括进来吗?嗨,米查利。我在post中添加了控制器,所以如果您打开Rails控制台并执行I18n.locale=:ru;Page.first.friendly_id您获得的名称是俄语,但I18n.locale=:en;Page.first.friendly_id是英文的,对吗?>>I18n.locale=:ru;Page.first.friendly_id Page Load 0.8ms选择页面。*从按页面排序的页面中。id ASC LIMIT 1页面::翻译加载0.4ms选择页面翻译。*从页面翻译中,其中Page_translations.Page_id=$1[[Page_id,1]=>o-saite>>I18n.locale=:en;Page.first.friendly_id页面加载0.9ms选择页面。*从页面按页面排序。id ASC限制1页面::翻译加载0.5ms选择页面翻译。*从页面翻译,其中页面翻译。页面翻译id=$1[[Page_id,1]=>关于站点
def languages(obj=nil)
    content_for(:switch_locale) do
      I18n.available_locales.each do |locale|
        I18n.with_locale(locale) do
          concat(
            if obj
             content_tag(:li, (link_to locale, url_for([:shop, obj]) ))
            else
             content_tag(:li, (link_to locale, url_for(locale: locale.to_s) ))
            end              
          )
        end
      end
    end
  end
- languages @category
- languages