etspring
@etspring
Начитанное быдло

Как осуществляется сериализация полей объекта в зависимости от локали в рельсах?

Доброго времени суток.
ENV: ruby 2.4.1, Rails 5.1, active_model_serializer

Имеются две модельки:
class Country < ApplicationRecord
    has_many :cities
end
class City < ApplicationRecord
    belongs_to :country
end


У обеих моделей есть поля title_en и title_ru, в которых хранятся названия на англицком и русском языках соответственно. Необходимо в зависимости от используемой локали рендерить определенные поля.

Возьмем для примера контроллер
class CitiesController < ApiController

    def show
      render json: City.find(params[:id]), locale: I18n.locale
    end

  end


И сериализатор
class CitySerializer < ActiveModel::Serializer
  attributes :id, :title
  belongs_to :country

  def title
  	case @instance_options[:locale]
  	when 'ru'
  		object.title_ru
  	when 'en'
  		object.title_en
  	end
  end

end

Сериализатору передается параметр locale, в зависимости от которого выдается нужный title, но при этом рендерятся все поля модели Country.
Запрос: localhost:3000/en/v1/cities/1
{
"id": 1,
"title": "Moscow",
"country": {
"id": 1,
"title_en": "Russia",
"title_ru": "Россия",
"created_at": "2017-10-12T17:14:31.971Z",
"updated_at": "2017-10-12T17:14:31.971Z"
}
}


Каким образоем можно отрендерить только определенные поля связанной модели в зависимости от локали?
Есть "безголовый вариант":
Добавить в сериализатор:
def country
  	case @instance_options[:locale]
  	when 'ru'
  		{ country_id: object.country.id, title: object.country.title_ru }
  	when 'en'
  		{ country_id: object.country.id, title: object.country.title_en }
  	end  	
  end

Но наверняка есть более изящное решение. Заранее спасибо.
  • Вопрос задан
  • 170 просмотров
Решения вопроса 1
oh_shi
@oh_shi
I18n.locale не нужно передавать параметром, он и так должен быть доступен внутри сериализатора. Хранить переводы отдельными столбцами самое "не изящное" решение, которое будет тяжелей использовать и поддерживать.

Альтернативные варианты:
1) хранить переводы в отдельных таблицах
2) хранить все переводы в одном столбце в формате jsonb
3) отдельные yaml файлы с переводами вам уже предлогали
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы