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}"
卫生署!谢谢,这绝对是! 8分钟后我会接受这个答案(因为StackOverflow的规则)。你对第二部分有什么看法吗?或者,我上面提到的最好的方法是什么? – Justin 2011-05-19 17:08:16
也许包含类名称到文件夹或文件名的一部分路径 – Anton 2011-05-19 17:11:11
谢谢,我只是有另一个问题:当我尝试创建一个新的对象,我得到以下错误:“未知的属性:照片”。我是否需要以其他方式编写委托:照片以启用属性? – Justin 2011-05-20 16:36:54