Frage

I have a project using Paperclip gem for attachments and Globalize3 for attribute translation. Records need to have a different attachment for each locale.

I though about moving Paperclip attributes to translation table, and that might work, but I don't think that would work when Paperclip needs to delete attachments.

What's the best way to achieve something like that?

UPDATE: to be clear, I want this because my client wants to upload different images for each locale.

War es hilfreich?

Lösung

Unfortunately I didn't find a way to do this using Globalize3. In theory, I could have added a separate model for image and add image_id to list of translated columns (to have something like MainModel -> Translation -> Image), but it seems that Globalize has some migration issues with non-string columns.

Instead of using Globalize3, I did this with a separate Image model with locale attribute and main model which accepts nested attributes for it. Something along the lines of:

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 part was getting form to accept nested attributes only for one image, instead of all images in has_many relation.

=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

Andere Tipps

You could also try the paperclip-globalize3 gem, it should handle the case you describe. https://github.com/emjot/paperclip-globalize3

Ok since you asked me to share my solution to this problem even though I am using Carrierwave as a library for uploading here is it:

Ok so I would have a model setup like this:

class MyModel < ActiveRecord::Base
  # ...

  translates :attr_one, :attr_two, :uploaded_file

Now what I need for CarrierWave to work is place to attach the uploader to and that can be done on the Translation model

  Translation.mount_uploader :uploaded_file, FileUploader
end

Now for your question about deleting, I think though I haven't needed to do it but it should work as the README says it should but on the translation model. https://github.com/jnicklas/carrierwave#removing-uploaded-files

MyModel.first.translation.remove_uploaded_file!

I haven't taken a look at paperclip for a good 2 years and if this is not applicable knowledge I suggest you try out carrierwave.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top