рис по умолчанию при использовании нескольких вложенных изображений на скрепке - PullRequest
0 голосов
/ 23 сентября 2011

Я использую Paperclip для загрузки нескольких изображений элементов. Я следовал за некоторыми из этого урока http://sleekd.com/general/adding-multiple-images-to-a-rails-model-with-paperclip/ Мои модели:

item.rb

has_many :item_images, :dependent => :destroy
accepts_nested_attributes_for :item_images, :reject_if => lambda { |l| l['item_image'].nil? }

ItemImage.rb

class ItemImage < ActiveRecord::Base
 belongs_to :item
 belongs_to :user
 #for image. Paperclip     following Bootstrap sizes.
 has_attached_file :image,
                :styles => { :large => ["330x230>",:png], :medium => ["210x150>",:png], :small => ["90x90>",:png], :thumb => ["32x32>", :png] },
                :default_url => '/images/missing_image_:style.png',
                :storage => :s3,
                :bucket => 'iscomp',
                :s3_credentials => "#{RAILS_ROOT}/config/amazon_s3.yml",
                :path => "iscomp/:attachment/:style/:id.:extension"
 validates_attachment_presence :image
 validates_attachment_size :image, :less_than => 5.megabytes
end 

Моя проблема в том, что, поскольку изображения хранятся во второй модели, я не могу получить доступ к пустому изображению по умолчанию, когда на @ item.item_image нет изображений / записей. Если бы я использовал скрепку непосредственно в @item, Paperclip вернет мне изображение по умолчанию.

Каков наилучший способ сделать это, если я не хочу продолжать добавлять операторы if / разве всякий раз, когда я вызываю миниатюру?

Ответы [ 2 ]

0 голосов
/ 10 мая 2012

Вы можете решить эту проблему:

Добавление itemimage_count в вашу миграцию

  def self.up  
   add_column :item, :itemimage_count, :integer, :default => 0

 Item.reset_column_information  
   Item.all.each do |item|  
     item.update_attribute :itemimage_count, item.itemimages.length  
   end  
 end  

 def self.down  
   remove_column :item, :itemimage_count  
 end
end

Это будет ассоциировать несколько ItemImages с каждым Item. Вы можете получить доступ к этому счетчику в своих видах, контроллерах и моделях.

Если вы хотите поиграть с этим, вы можете просто установить условие прицела в вашей модели.

item.rb

scope :list, :conditions => ["itemimages_count >= 0"]

Item_controller

@itemimages = Item.list

Я бы лично сделал частичное в ваших представлениях с 1 набором операторов if else, когда вы хотите отобразить изображения, просто вызовите частичное.

if Item.itemimages_count == 0
    #show this image
end
 #code that displays an Item's image
    #show the image in itemimages

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 24 сентября 2011

Я не знаю, ищете ли вы элегантный способ сделать это, но я сделал так, чтобы создать изображение по умолчанию, и если @ item.item_image возвращает пустое значение, я отображаю пустое изображение по умолчанию. Я не использовал скрепку по умолчанию.

...