2016-01-19 8 views
0

У меня проблема с globalize и friendly_id. На сайте есть 2 языка Ru и En. Gem friendly_id, globalize и friendly_id-globalize настроены и работают. Если изменить язык с русского на английский, все хорошо:Rails globalize + friendly id

http://127.0.0.1:3000/ru/o-saite -> http://127.0.0.1:3000/en/about-site 

Но когда я изменяю с английского на русский Going Wrong перенаправлением:

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 TranslatePage < ActiveRecord::Migration 
    def self.up 
    Page.create_translation_table!({ 
     title: :string, 
     content: :text, 
     slug: :string 
    }, { 
     migrate_data: true 
    }) 
    end 

    def self.down 
    Page.drop_translation_table! migrate_data: true 
    end 

конец

из application.rb

config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] 
config.i18n.default_locale = :ru 
config.i18n.fallbacks = true 

страницы контроллера

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 

что может быть проблема?

SOLVED?

Проблема была во взглядах. В макетах/aplication.html.slim был:

ul class='change_lang' 
li = link_to_unless I18n.locale == :en, "EN", locale: :en 
li = link_to_unless I18n.locale == :ru, "RU", locale: :ru 

Сейчас на страницах/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 

В макетах/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 

https://github.com/norman/friendly_id-globalize/issues/7

Есть более минималистический подход. Но этот сервер методов висит.

+0

Я думаю, что перенаправление находится в вашем контроллере, не так ли? Можете ли вы включить его? –

+0

Hi, MichalI. Я добавляю контроллер в сообщение. – alexin

+0

Итак, если вы откроете консоль Rails и выполните 'I18n.locale =: ru; Страница.first.friendly_id' вы получаете имя на русском языке, но для 'I18n.locale =: en; Страница.first.friendly_id' на английском, не так ли? –

ответ

0

я имею общий ответ. , пожалуйста, позвольте мне теперь, если это сработает для вас. , если у вас есть пространство имен вы можете настроить в :shop, если не только url_for(obj)

в вашем application_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) или wh erever вы хотите сделать переводы. =yield(:switch_locale)

Смежные вопросы