Как сделать локализованные вложения 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 лет, и если это не относится к знаниям, я предлагаю вам попробовать несущую.