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

所以这个版本试图被创建三次,两次用于临时文件,一次用于最终文件。模型属性只为最终文件设置。这有关系吗?谁能告诉我这与这个例子有什么不同?

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

应用程序/模型/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模型是另一个模型的子模型,并且正在以嵌套形式添加到此处。无论出于何种原因,子模型的属性都没有由载波处理版本的时间设置。

我已经通过向我的父模型添加载波附件来验证这一点App。处理App附件的版本时,会设置属性。

也许稍后我会更深入地尝试并更好地理解(我对 Rails 很陌生),但现在我正在通过没有条件版本来解决这个问题。

于 2013-04-04T17:46:06.810 回答
1

我今晚有同样的问题,我正在做一些实验,最后我想通了,似乎当你第一次创建一个版本时(当你发布你的表单时),如果你有这行:

model.image_type == 'iPod Screenshot'

这意味着您必须在表单中指定一个字段,image_type并且该字段的值应为“iPod Screenshot”

当您显示图像时,CarrierWave 会验证相同的内容,article.image_url(:ipod_portrait_thumb)这意味着您的数据库中应该有一个名为image_type“iPod Screenshot”的字段

所以如果你有这条线:

version :ipod_portrait_thumb, :if => :is_ipod?

您是在告诉 CarrierWave 每次创建或显示记录时执行 ipod_portrait_thumb 函数

如果您的表单不包含field image_type带有值“iPod Screenshot”的情况,例如因为您在模型/控制器中设置它,方法是检查另一个字段以允许 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 回答