4

添付ファイルに Paperclip gem を使用し、属性変換に Globalize3 を使用するプロジェクトがあります。レコードには、ロケールごとに異なる添付ファイルが必要です。

Paperclip の属性を変換テーブルに移動することについては考えましたが、うまくいくかもしれませんが、Paperclip が添付ファイルを削除する必要がある場合はうまくいかないと思います。

そのようなことを達成するための最良の方法は何ですか?

更新:明確にするために、クライアントがロケールごとに異なる画像をアップロードしたいので、これが必要です。

4

3 に答える 3

3

残念ながら、Globalize3 を使用してこれを行う方法が見つかりませんでした。理論的には、画像用に別のモデルを追加し、変換された列のリストに image_id を追加することもできましたが (MainModel -> Translation -> Image のようなものにする)、Globalize には文字列以外の列に関する移行の問題があるようです。

Globalize3 を使用する代わりに、locale 属性を持つ別の Image モデルと、ネストされた属性を受け入れるメイン モデルを使用してこれを行いました。次のようなもの:

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 関係のすべての画像ではなく、1 つの画像に対してのみネストされた属性を受け入れるフォームを取得することでした。

=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
于 2013-04-06T13:45:32.873 に答える
1

paperclip-globalize3 gem を試すこともできます。説明したケースを処理する必要があります。https://github.com/emjot/paperclip-globalize3

于 2013-05-07T17:43:32.127 に答える
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 年間ペーパークリップを見ていませんでした。これが適切な知識でない場合は、キャリアウェーブを試してみることをお勧めします。

于 2013-03-28T17:55:33.840 に答える