Carrierwave和has_many

时间:2013-04-14 08:03:18

标签: ruby-on-rails many-to-many carrierwave

我有这样的产品型号:

class Product < ActiveRecord::Base
 has_many :images, :class_name => 'ProductImage', :order => 'position DESC', :dependent => :destroy

def image_thumb
    images.first.image.thumb.url
  end

  def image
    images.first.image.url
  end
end

ProductImage模型:

class ProductImage < ActiveRecord::Base
  attr_accessible :image, :position, :product_id, :title

  belongs_to :product

  default_scope order('position ASC')

  mount_uploader :image, ProductImageUploader
end

上传者模型:

class ProductImageUploader < CarrierWave::Uploader::Base
...
 def default_url
  asset_path([version_name, "default.jpg"].compact.join('_'))
 end
end

但如果我没有为产品上传任何图片,我会在image_thumb和图像方法中获得'nil'。如果没有上传任何图片且Product和ProductImage模型之间的关系是一对多的话,如何获取default_url?

2 个答案:

答案 0 :(得分:4)

如果您无法访问上传者,则上传者无法帮助您,因此您必须手动执行此操作。您已经使用了演示者(或多或少),所以这非常简单:

def image_thumb
  if images.any?
    images.first.image.thumb.url
  else
    asset_path("default.jpg")
  end
end

def image
  if images.any?
    images.first.image.url
  else
    asset_path("thumb_default.jpg")
  end
end

类似的代码适用于belongs_to关系。

答案 1 :(得分:0)

您为default_url获得的价值是多少?

可能路径没有正确评估。

尝试这样的事情(当然要纠正下面的路径到它应该是什么):

class ProductImageUploader < CarrierWave::Uploader::Base
   ...

   def default_url
      "/assets/" + [version_name, "default.jpg"].compact.join('_')
   end
end