2013-03-17 2 views
4

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

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

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

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

+0

Я не знаю globalize3, и это не совсем решение, но я думаю, что было бы намного проще реализовать whith [Carrierwave] (https://github.com/jnicklas/carrierwave), чем с помощью Paperclip. Carrierwave использует отдельные классы («Uploaders») для выполнения своей работы и просто нуждается в атрибуте вашей модели, который будет монтироваться, - что, по-видимому, предоставляет глобализация3. –

+0

Я тоже мог бы сделать то же самое с Paperclip (он также использует несколько строковых столбцов, которые можно было бы перевести), но у одного из них были бы проблемы с обновлением и/или уничтожением вложений. –

+0

, может быть, добавить свои собственные обратные вызовы? –

ответ

3

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

Вместо использования Globalize3 я сделал это с отдельной моделью изображения с атрибутом 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 

Tricky часть получал форму, чтобы принимать вложенные атрибуты только для одного изображения, а все изображения в 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 
0

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

1

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

+0

Драгоценный камень paperclip-globalize3 полностью устарел. Я думаю, что решение Слободана Ковачевича в ответе выше - это будущий стабильный! –

Смежные вопросы