我正在尝试为图像上传创建一个单独的模型类,该模型类以前在对象的控制器中。我还想让它不可知,所以我可以使用来自多个对象的一个类上传图像。
在原始对象的模型类中,我现在有以下内容:
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'
我是否需要在对象和 PhotoStore 之间建立某种其他类型的关系?
还有一个单独的问题:使它成为不可知论者的最佳方法是什么?由于它只使用对象的 ID,我可以只在文件名中包含对象的名称,但这是最好的方法吗?
谢谢!
因为在File.join PHOTO_STORE, "#{id}.#{extension}"
你调用方法 PhotoStore#id
,但它不存在。
你应该这样做
File.join PHOTO_STORE, "#{@object.id}.#{@object.extension}"