0

Railsアプリでcarrierwaveを使用して条件付きバージョンを設定しようとしています。ここで提供されている例の正確な複製と思われるものを実装しました。

is_ipod?私が単にを返さない限り、バージョンは決して作成されませんtrue。以下のコードは私が現在持っているものであり、機能していません。image_type属性が実際に正しく設定されていることを確認するために使用したコメント付きセクションに注意してください。

version :ipod_portrait_thumb, :if => :is_ipod? do

  process resize_to_fit: [150,200]

end

def is_ipod? image
  model.image_type == 'iPod Screenshot'

  #if (model.image_type == "iPod Screenshot")
  #if (model.image_type!=nil)
    #puts "+++++"+model.image_type
  #  if (model.image_type=="iPod Screenshot")
      #puts "+++++++ I AM HERE"
  #   return true
  #  end
  #end
end

is_ipod?このように見える場合:

def is_ipod? image
  true
end

バージョンは期待どおりに作成されます。私は何が欠けていますか?ありがとう!

アップデート:

is_ipod?メソッドを次のように編集しました。

def is_ipod? image     
  puts (image.path || "") + ': ' + ((model.image_type||"") == 'iPod Screenshot').to_s
  model.image_type == 'iPod Screenshot'
end

これをコンソールに出力します。

/public/uploads/tmp/20130325-1024-15906-5363/drawing.png: false
/public/uploads/tmp/20130325-1024-15906-5363/drawing.png: false
/public/uploads/app_image/image/59/drawing.png: true

そのため、バージョンは3回作成され、一時ファイル用に2回、最終ファイル用に1回作成されます。model属性は、最終ファイルに対してのみ設定されます。これは関係がありますか?これがこの例とどのように違うのか誰か教えてもらえますか?

class MyUploader < CarrierWave::Uploader::Base

  version :monkey, :if => :is_monkey?

  protected

  def is_monkey? picture
    model.favorite_food == 'banana'
  end
end

これが役立つ場合の私のモデルクラスです:

class AppImage < ActiveRecord::Base
  attr_accessible :app_id, :image, :image_type, :image_cache
  belongs_to :app

  mount_uploader :image, AppImageUploader

  validates :image_type, presence: true
  validates :image, presence: true
end

ありがとう!

4

3 に答える 3

2

同様の問題がありました^そして、モデルの属性に応じて異なるサイズを作成しようとしました。私の解決策は単純です。保存後にバージョンを再作成するだけです。

app / uploaders / project_item_picture_uploader.rb

class ProjectItemPictureUploader < CarrierWave::Uploader::Base

  ...

  version :preview do
    process dynamic_process: true
  end

  protected

  def dynamic_process(*args)
    resize_to_fill *(model.get_size) if model.persisted?
  end

end

app / model / project_item.rb

class ProjectItem < ActiveRecord::Base
  mount_uploader :picture, ProjectItemPictureUploader
  validates_presence_of :picture

  def get_size
    double ? [168, 57] : [76, 57]
  end

  after_save :recreate_delayed_versions!
  def recreate_delayed_versions!
    picture.recreate_versions!
  end
end
于 2013-07-26T20:41:52.937 に答える
1

これは、AppImageモデルが別のモデルの子であり、ネストされたフォームに追加されているために発生していることがわかります。何らかの理由で、子モデルには、carrierwaveがバージョンを処理する時間によって設定された属性がありません。

親モデルにcarrierwaveアタッチメントを追加して、これを確認しましたAppApp添付ファイルのバージョンが処理されると、属性が設定されます。

後でもっと深く掘り下げて理解を深めるつもりですが(私はRailsにかなり慣れていません)、今のところ、条件付きバージョンを持たないことで問題を回避しています。

于 2013-04-04T17:46:06.810 に答える
1

私は今夜​​同じ問題を抱えています、そして私はそれでいくつかの実験をしています、最終的に私はあなたが初めてバージョンを作成するとき(あなたがあなたのフォームを投稿するとき)、あなたがこの行を持っているならどうやらわかりました:

model.image_type == 'iPod Screenshot'

つまり、フォームに名前の付いたフィールドが必須image_typeであり、このフィールドの値は「iPodスクリーンショット」である必要があります。

CarrierWaveは、次のように画像を表示するときに同じことを確認します。article.image_url(:ipod_portrait_thumb)つまり、データベースにimage_type「iPodスクリーンショット」という値の名前のフィールドが必要です。

したがって、この行がある場合:

version :ipod_portrait_thumb, :if => :is_ipod?

レコードを作成または表示するたびにipod_portrait_thumb関数を実行するようにCarrierWaveに指示しています

モデル/コントローラーに設定したなどの理由で、フォームに値が「iPodスクリーンショット」が含まれていない場合は、field image_type別のフィールドをチェックして、CarrierWaveが条件付きバージョンを作成できるようにする方法があります。このようなもの :

model.image_type == 'iPod Screenshot' || another_field_in_my_form_help_you_to_know_type_is_ipode == "something" # or just .present? rather than == "something" switch your case

ここで、CarrierWaveが最初にバージョンを作成しようとすると、このanother_field _......がチェックされ、レコード(製品、記事など)を表示するページがある場合はmodel.image_type == 'iPod Screenshot'、データベースにすでに保存されていることを確認します。

これがお役に立てば幸いです:)

于 2013-11-19T08:49:40.500 に答える