除非选择了某个关系,否则验证allow_blank

时间:2014-12-03 13:56:39

标签: ruby-on-rails validation activerecord has-and-belongs-to-many

我有一个带有Post模型和Tag模型的rails 4应用程序。这些模型与HABTM关系有关。

class Post < ActiveRecord::Base
  has_and_belongs_to_many :tags
...
end

Post模型有一个&#34;图像&#34;列并通过格式验证验证其正确性仍然允许空白。

validates :image, 
    format: { with: /\Ahttps\:\/\/s3.*amazonaws\.com.*\.png\z/ , message: 'Must be a valid url within S3 bucket' },
    allow_blank: true

如果选择了特定标记,我需要添加一个不允许Post.image为空的验证。例如,如果Tag.name ==&#34; foo&#34;与此帖子相关联,然后Post.image不能为空。

这是应该通过的型号规范:

it 'should not allow a post with tag name "foo" to have an empty image' do
  mytags = [create(:tag, name: 'foo')]
  expect(build(:post, image: '', tags: mytags)).to_not be_valid
end

什么验证可以让我的测试通过?

1 个答案:

答案 0 :(得分:1)

class TagValidator < ActiveModel::Validator
  def validate(record)
    record.tags.each do |tag|
      if tag.name == "foo" && record.image.blank?
        record.errors[:base] << "Image name cannot be blank for this tag"
      end
    end
  end
end


class Post < ActiveRecord::Base
  validates_with TagValidator
end