这是我的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
答案 0 :(得分:2)
一个问题是验证是在类上下文中声明的。 self
这里引用的是类,而不是实例,因此调用self.service
会引发错误,因为service
是一个实例方法。
ActiveModel验证通常允许您传入lambda块,您可以使用该实例来确定有效性。但Paperclip doc说validates_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