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

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

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

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

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


person Slobodan Kovacevic    schedule 17.03.2013    source источник
comment
я не знаю globalize3, и это не совсем решение, но я думаю, что это было бы намного проще реализовать с помощью Carrierwave, чем с Paperclip. Carrierwave использует отдельные классы (Uploaders) для выполнения своей работы, и ей просто нужен атрибут вашей модели, на который будет установлен - что, по-видимому, предоставляет globalize3.   -  person m_x    schedule 21.03.2013
comment
Я мог бы сделать то же самое и с Paperclip (он также использует несколько строковых столбцов, которые можно было бы перевести), но у любого из них были бы проблемы с обновлением и/или уничтожением вложений.   -  person Slobodan Kovacevic    schedule 23.03.2013
comment
может быть, тогда добавить свои собственные обратные вызовы?   -  person m_x    schedule 23.03.2013
comment
У меня что-то подобное реализовано для Carrierwave + Globalize3. Если это что-то ценное для вас, я могу поделиться этим, если хотите. Дай мне знать.   -  person Hugo    schedule 26.03.2013
comment
@ Хьюго, да, было бы здорово, если бы ты им поделился. Я понимаю, что мне придется сделать это самостоятельно, т.е. просто создать отдельный класс с атрибутом локали и вложением Paperclip. Затем в основном классе сделайте вложения has_many.   -  person Slobodan Kovacevic    schedule 27.03.2013
comment
Хорошо, я увидел это только сейчас, дайте мне день, чтобы опубликовать то, что у меня есть.   -  person Hugo    schedule 28.03.2013


Ответы (3)


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

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

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
person Slobodan Kovacevic    schedule 06.04.2013

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

person Max    schedule 07.05.2013
comment
Камень paperclip-globalize3 полностью устарел. Я думаю, что решение Слободана Ковачевича в ответе выше является будущим стабильным! - person Simon Franzen; 27.11.2016

Хорошо, так как вы попросили меня поделиться своим решением этой проблемы, хотя я использую 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#removing-uploaded-files

MyModel.first.translation.remove_uploaded_file!

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

person Hugo    schedule 28.03.2013