回形针的动态内容类型验证

时间:2015-04-10 23:07:21

标签: ruby-on-rails paperclip content-type

这是我的Rail4应用程序:应用程序将提供许多服务,每个服务可能有很多提交。提交可以是图片,也可以是文字文件,也可以是pdf文件。但是,提交的内容类型实际上是由服务对象定义的。

我知道有一个validates_attachment_content_type函数,但问题是如何根据服务对象动态更改content_type?

以下是我项目的代码:

class Service < ActiveRecord::Base
  attr_acccessor :service_content_type
  has_many :submissions
end

class Submission < ActiveRecord::Base
  belongs_to :service

  has_attached_file :attachment
  validates_attachment_content_type :attachment, 
    :content_type => self.service.service_content_type # THIS LINE IS NOT WORKING
end

3 个答案:

答案 0 :(得分:2)

一个问题是验证是在类上下文中声明的。 self这里引用的是类,而不是实例,因此调用self.service会引发错误,因为service是一个实例方法。

ActiveModel验证通常允许您传入lambda块,您可以使用该实例来确定有效性。但Paperclip docvalidates_attachment_content_type只允许传入String,Regexp或包含这两种类型元素的数组。

您可以使用自定义验证方法确保attachment_content_type列的值正确。但我不能100%确定这是否提供与validates_attachment_content_type相同的安全性。

class Submission < ActiveRecord::Base
  belongs_to :service

  has_attached_file :attachment

  validate :validate_content_type

  def validate_content_type
    unless attachment_content_type == service.service_content_type
      errors.add(:attachment_content_type, "must be #{service.service_content_type}")
    end
  end
end

或者您可以对lambda使用内置的Rails验证,但对错误消息的控制较少:

  validates :attachment_content_type,
    inclusion: { in: ->(submission) { [submission.service.service_content_type] } }

答案 1 :(得分:0)

self.service.service_content_type必须是正则表达式,我猜不是。阅读doc

答案 2 :(得分:0)

您可以通过以下方式访问:

validates_attachment_content_type :attachment, :content_type => @service.service_content_type

它在以下环境中对我有用(这是一个数组,而不是“对象”,但我想它应该翻译):

validates_attachment_content_type :detail, :content_type => @IMAGE_VIDEO_AUDIO_FILE_CONTENT_TYPES