2010-10-29 106 views
2

我想上傳到我創建的投資組合應用程序,特別是試圖找到將delayed_job掛鉤到進程中的位置。這一切工作,否則。現在它在app/controllers/portfolio_items_controller.rb:18:in 'create'上返回undefined method 'call' for #<Class:0xae68750>,所以這裏是我的模型和控制器的那部分...任何人都可以看到任何可能出錯的東西? http://madeofcode.com/posts/42-paperclip-s3-delayed-job-in-rails用回形針上傳到Heroku上的S3(delayed_job question)

/app/controllers/portfolio_items_controller.rb

def create 
    @portfolio_item = PortfolioItem.new(params[:portfolio_item]) 
    if @portfolio_item.save 
    flash[:notice] = "Portfolio item created. As soon as files are uploaded Portfolio item will be made live." 
    redirect_to @portfolio_item 
    else 
    render :action => 'new' 
    end 
end 

/app/models/asset.rb

class Asset < ActiveRecord::Base 
    attr_accessible :image, :image_file_name, :image_content_type, :image_file_size, :portfolio_item_id, :order 

    belongs_to :portfolio_item 

    has_attached_file :image, 
    :styles => { 
     :thumb => "20x20#", 
     :small => "100x100", 
     :large => "600x600>" 
       }, 
    :storage => :s3, 
    :s3_credentials => { 
     :access_key_id => ENV["S3_KEY"], 
     :secret_access_key => ENV["S3_SECRET"] 
         }, 
    :bucket => ENV["S3_BUCKET"], 
    :path => "portfolio/:attachment/:id/:style/:basename.:extension" 

    before_source_post_process do |image| 
    if source_changed? 
     processing = true 
     false 
    end 
    end 

    after_save do |image| 
    if image.source_changed? 
     Delayed::Job.enqueue ImageJob.new(image.id) 
    end 
    end 

    def regenerate_styles! 
    self.source.reprocess! 
    self.processing = false 
    self.save(false) 
    end 

    def source_changed? 
    self.source_file_size_changed? || 
    self.source_file_name_changed? || 
    self.source_content_type_changed? || 
    self.source_update_at_changed? 
    end 
end 

class ImageJob < Struct.new(:image_id) 
    def perform 
    Image.find(self.image_id).regenerate_styles! 
    end 
end 

編輯:我現在使用的鉤子我從這個博客了:感謝善良的人,這不再是失蹤。但是現在它的before_source_post_process沒有定義?而且我無法在任何地方找到這種方法,除了那篇博文和這個SO問題。有什麼更合適的嗎?

回答

2

我想這:

@portfolio_item = PortfolioItem.(params[:portfolio_item]) 

應該最有可能是這樣的:

@portfolio_item = PortfolioItem.new(params[:portfolio_item]) 
+0

哦,親愛的。對,就是那樣。它仍然不起作用。我編輯了這個問題。 – 2010-10-29 17:57:23

4

的before_source_post_process不會爲你工作。它僅適用於:

has_attached_file :source 

你的情況應該是

before_image_post_process 

同樣,source_changed?方法應該是:

def source_changed? 
    self.image_file_size_changed? || 
    self.image_file_name_changed? || 
    self.image_content_type_changed? || 
    self.image_update_at_changed? 
end