Rails 3自定义类问题

问题描述:

我正在尝试为图像上载创建一个单独的模型类,该类先前位于对象的控制器中。我也想让它不可知,所以我可以使用多个对象中的一个类上传图像。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,所以我可以在文件名中包含对象的名字,但这是做到这一点的最佳方式吗?

谢谢!

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

你应该做的

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

卫生署!谢谢,这绝对是! 8分钟后我会接受这个答案(因为*的规则)。你对第二部分有什么看法吗?或者,我上面提到的最好的方法是什么? – Justin 2011-05-19 17:08:16

+0

也许包含类名称到文件夹或文件名的一部分路径 – Anton 2011-05-19 17:11:11

+0

谢谢,我只是有另一个问题:当我尝试创建一个新的对象,我得到以下错误:“未知的属性:照片”。我是否需要以其他方式编写委托:照片以启用属性? – Justin 2011-05-20 16:36:54