我正在尝试为图像上传创建一个单独的模型类,以前是在对象的控制器中。我也想让它不可知,所以我可以使用多个对象中的一个类来上传图像。
在我的原始对象的模型类中,我现在有以下内容:
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时,这会引发下面的错误?对象视图中的方法。
未定义的局部变量或#
的方法`id'
我是否需要在Object和PhotoStore之间建立其他类型的关系?
另外一个问题:使这种不可知论者最好的方法是什么?由于它只使用对象的ID,我可以在文件名中包含Object的名称,但这是最好的方法吗?
谢谢!
答案 0 :(得分:1)
因为在File.join PHOTO_STORE, "#{id}.#{extension}"
您调用方法PhotoStore#id
,但它不存在。
你应该这样做
File.join PHOTO_STORE, "#{@object.id}.#{@object.extension}"