我有一个项目使用 Paperclip gem 进行附件和 Globalize3 进行属性翻译。记录需要为每个区域设置不同的附件。
我想将 Paperclip 属性移动到翻译表,这可能会起作用,但我认为当 Paperclip 需要删除附件时这不会起作用。
实现这样的目标的最佳方法是什么?
更新:要清楚,我想要这个,因为我的客户想要为每个语言环境上传不同的图像。
我有一个项目使用 Paperclip gem 进行附件和 Globalize3 进行属性翻译。记录需要为每个区域设置不同的附件。
我想将 Paperclip 属性移动到翻译表,这可能会起作用,但我认为当 Paperclip 需要删除附件时这不会起作用。
实现这样的目标的最佳方法是什么?
更新:要清楚,我想要这个,因为我的客户想要为每个语言环境上传不同的图像。
不幸的是,我没有找到使用 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
您也可以尝试使用回形针-globalize3 gem,它应该可以处理您描述的情况。https://github.com/emjot/paperclip-globalize3
好的,因为您要求我分享我对这个问题的解决方案,即使我使用 Carrierwave 作为库来上传这里是它:
好的,所以我会有这样的模型设置:
class MyModel < ActiveRecord::Base
# ...
translates :attr_one, :attr_two, :uploaded_file
现在,CarrierWave 工作所需的是将上传器附加到的地方,这可以在 Translation 模型上完成
Translation.mount_uploader :uploaded_file, FileUploader
end
现在对于你关于删除的问题,我认为虽然我不需要这样做,但它应该像自述文件所说的那样工作,但在翻译模型上应该。https://github.com/jnicklas/carrierwave#removing-uploaded-files
MyModel.first.translation.remove_uploaded_file!
我已经有 2 年没有看过回形针了,如果这不是适用的知识,我建议你试试carrierwave。