Как сделать локализованные вложения Paperclip с Globalize3?

У меня есть проект, использующий гем Paperclip для вложений и Globalize3 для перевода атрибутов. Записи должны иметь разные вложения для каждой локали.

Я думаю о переносе атрибутов Paperclip в таблицу перевода, и это может сработать, но я не думаю, что это сработает, когда Paperclip потребуется удалить вложения.

Какой лучший способ добиться чего-то подобного?

ОБНОВЛЕНИЕ: чтобы быть ясным, я хочу это, потому что мой клиент хочет загрузить различные изображения для каждой локали.

3 ответа

Решение

К сожалению, я не нашел способа сделать это с помощью Globalize3. Теоретически, я мог бы добавить отдельную модель для изображения и добавить image_id в список переведенных столбцов (чтобы было что-то вроде MainModel -> Translation -> Image), но, похоже, у Globalize есть некоторые проблемы с миграцией с нестроковыми столбцами.

Вместо того, чтобы использовать Globalize3, я сделал это с отдельной моделью Image с атрибутом locale и основной моделью, которая принимает для него вложенные атрибуты. Что-то вроде:

class MainModel < ActiveRecord::Base
  has_many :main_model_images
  accepts_nested_attributes_for :main_model_images

  # return image for locale or any other as a fallback
  def localized_image(locale)
    promo_box_images.where(:locale => locale).first || promo_box_images.first
  end
end

class MainModelImage < ActiveRecord::Base
  belongs_to :main_model
  has_attached_file :image

  validates :locale,
    :presence => true,
    :uniqueness => { :scope => :main_model_id }
end

Сложно было получить форму, позволяющую принимать вложенные атрибуты только для одного изображения вместо всех изображений в отношении has_many.

=f.fields_for :main_model_images, @main_model.image_for_locale(I18n.locale) do |f_image|
  =f_image.hidden_field :locale
  =f_image.label :image

Вы также можете попробовать гем paperclip-globalize3, он должен обрабатывать описанный вами случай. https://github.com/emjot/paperclip-globalize3

Хорошо, поскольку вы попросили меня поделиться своим решением этой проблемы, хотя я использую Carrierwave в качестве библиотеки для загрузки, вот она:

Хорошо, поэтому я хотел бы настроить модель следующим образом:

class MyModel < ActiveRecord::Base
  # ...

  translates :attr_one, :attr_two, :uploaded_file

Теперь для работы CarrierWave нужно место, к которому можно подключить загрузчик, и это можно сделать на модели перевода.

  Translation.mount_uploader :uploaded_file, FileUploader
end

Теперь, что касается вашего вопроса об удалении, я думаю, что мне не нужно было это делать, но он должен работать так, как говорит README, но на модели перевода. https://github.com/jnicklas/carrierwave

MyModel.first.translation.remove_uploaded_file!

Я не смотрел скрепку в течение хороших 2 лет, и если это не относится к знаниям, я предлагаю вам попробовать несущую.

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