Rails переключаются с переведенного URL

Я настроил I18n, Globalize и FriendlyId в многоязычном Rails-приложении. Более того, я делаю вид, что перевожу URL в соответствии с локалью.

Например:

http://localhost:3000/es/micontroller/mi-casa   
http://localhost:3000/en/mycontroller/my-house  

Эти URL уже существуют, перевод работает как положено.

Это ссылки на переключатели языка, которые я добавил:

= link_to_unless I18n.locale == :es, "Español", locale: :es  
= link_to_unless I18n.locale == :en, "English", locale: :en

Моя проблема в том, что когда я переключаю языки, URL-адрес только изменяет параметр локали, а не изменяет слаг.

Например, переключение с английского на испанский приводит к чему-то вроде:

http://localhost:3000/es/mycontroller/my-house

PD: хорошая практика, что я притворяюсь делать с моими URL? Я искал некоторое время без результатов.

1 ответ

Вы не предоставили полную спецификацию своей проблемы, поэтому я разработал собственную реализацию.

Мне удалось сделать то, что вы ожидаете, с помощью дополнительной помощи этого драгоценного камня: https://github.com/norman/friendly_id-globalize

Он также переводит столбец слагов, необходимый для friendly_id. Без этого пуля была взята непосредственно из основной модели, а не из перевода.

Несколько фрагментов из моей настройки (я использовал Post в качестве модели / каркаса):

# model
class Post < ActiveRecord::Base
  extend FriendlyId
  translates :title, :body, :slug
  friendly_id :title, use: :globalize
end

# routes
scope "/:locale", locale: /#{I18n.available_locales.join("|")}/ do
  resources :posts
end

# migration
class CreatePosts < ActiveRecord::Migration
  def up
    create_table :posts do |t|
      t.string :slug 
      # slug column needs to be both in normal and translations table
      # according to friendly_id-globalize docs
      t.timestamps null: false
    end

    Post.create_translation_table! title: :string, body: :text, slug: :string
  end

  def down
    drop_table :posts
    Post.drop_translation_table!
  end
end


# switcher in view
<%= link_to_unless I18n.locale == :en, "English", locale: :en %>
<%= link_to_unless I18n.locale == :es, "Español", locale: :es %>

Я надеюсь, это поможет. Если нет, пожалуйста, предоставьте более подробную информацию.

Другие вопросы по тегам