rails 3.0和carrierwave如何防止非图像类型的版本创建

时间:2011-04-20 18:35:17

标签: ruby-on-rails-3 file-type carrierwave

我正在努力尝试实现一些最初对我来说简单的东西。在使用 carrierwave rails 3.0 应用的上下文中。用户必须能够下载除.exe文件之外的任何类型的文档。在Carriewave有白名单

def extension_white_list
    %w(jpg jpeg gif png)
end

我知道有一个黑名单,在我的情况下也会更容易。无论如何,这不是主要问题。

用于图像文件我在我的上传器类中设置了2个版本。

 version :thumb do
      process :resize_to_fit => [50, 50]  
  end


  version :small do
     process :resize_to_fit => [125, 125]
  end

我不得不承认我对这种语法有点困惑。什么样的ruby代码“版本”定义。我的意思是,它不是一种方法,所以在课堂上是什么?

我试图创建一个方法图片?

def image?
%w(jpg jpeg gif png).include?(filename.extension.to_s)
end

然后从版本代码中调用它以防止在文件不是图像时创建那些版本

version :thumb do
  if image?
    process :resize_to_fit => [50, 50]  
  end
end

但此代码会抛出错误

undefined method `image?' for #<Class:0x000001017274f8> 

任何帮助将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:14)

以下是您实际可以执行此操作的方式。当前版本的carrierwave现在支持条件版本处理。请参阅Wiki页面https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Do-conditional-processing

要仅为特定类型创建版本,请执行以下操作:

version :thumb, :if => :image? do
  process :resize_to_fit => [50, 50]  
end

protected

def image?(new_file)
  new_file.content_type.include? 'image'
end

答案 1 :(得分:0)

最后为这个问题提供清晰明确的答案:https://gist.github.com/995663