2011-05-19 73 views
0

我正在嘗試爲圖像上載創建一個單獨的模型類,該類先前位於對象的控制器中。我也想讓它不可知,所以我可以使用多個對象中的一個類上傳圖像。Rails 3自定義類問題

我在原來的對象的模型類,我現在有以下幾點:

class Object < ActiveRecord::Base 
    after_save :photo_store 
    delegate :has_photo?, :photo, :photo_path, :store_photo, :photo_filename, :to => :photo_store 

    def photo_store 
    PhotoStore.new(self) 
    end 
end 

然後,PhotoStore類看起來是這樣的:

class PhotoStore 
    attr_reader :object 

    def initialize(object) 
    @object = object 
    end 

    def photo=(file_data) 
    unless file_data.blank? 
     @file_data = file_data 
     self.extension = file_data.original_filename.split('.').last.downcase 
    end 
    end 

    PHOTO_STORE = File.join RAILS_ROOT, 'public', 'photo_store' 

    def photo_filename 
    File.join PHOTO_STORE, "#{id}.#{extension}" 
    end 

    def photo_path 
    "/photo_store/#{id}.#{extension}" 
    end 

    def has_photo? 
    File.exists? photo_filename 
    end 

    private 

    def store_photo 
    if @file_data 
     FileUtils.mkdir_p PHOTO_STORE 
     File.open(photo_filename, 'wb') do |f| 
     f.write(@file_data.read) 
     end 
    end 
    end 
end 

然而,這將引發下面當我嘗試錯誤並使用has_photo?方法在對象的視圖中。

undefined local variable or method `id' for #

我是否需要在Object和PhotoStore之間放置一些其他類型的關係?

另外一個問題:使這個不可知論的最佳方法是什麼?由於它只使用對象的ID,所以我可以在文件名中包含對象的名字,但這是做到這一點的最佳方式嗎?

謝謝!

回答

1

因爲在File.join PHOTO_STORE, "#{id}.#{extension}"你調用方法PhotoStore#id,但它不存在。

你應該做的

File.join PHOTO_STORE, "#{@object.id}.#{@object.extension}" 
+0

衛生署!謝謝,這絕對是! 8分鐘後我會接受這個答案(因爲StackOverflow的規則)。你對第二部分有什麼看法嗎?或者,我上面提到的最好的方法是什麼? – Justin 2011-05-19 17:08:16

+0

也許包含類名稱到文件夾或文件名的一部分路徑 – Anton 2011-05-19 17:11:11

+0

謝謝,我只是有另一個問題:當我嘗試創建一個新的對象,我得到以下錯誤:「未知的屬性:照片」。我是否需要以其他方式編寫委託:照片以啓用屬性? – Justin 2011-05-20 16:36:54