Rails 3自定义类问题

时间:2011-05-19 17:00:46

标签: ruby-on-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时,这会引发下面的错误?对象视图中的方法。

  

未定义的局部变量或#

的方法`id'

我是否需要在Object和PhotoStore之间建立其他类型的关系?

另外一个问题:使这种不可知论者最好的方法是什么?由于它只使用对象的ID,我可以在文件名中包含Object的名称,但这是最好的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

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

你应该这样做

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