代码之家  ›  专栏  ›  技术社区  ›  Daniel Vandersluis

如何验证ActiveRecord模型中的虚拟属性?

  •  2
  • Daniel Vandersluis  · 技术社区  · 15 年前

    我正在使用虚拟属性从表单中逗号分隔的文本框(基于 Railscasts #167 ):

    class Entry < ActiveRecord::Base
      has_many :entry_tags
      has_many :tags, :through => :entry_tags
    
      after_save :update_tags
      attr_writer :tag_names
    
      def tag_names
        tags.map(&:name).join(", ")
      end
    
      def update_tags
        if @tag_names
          self.tags = @tag_names.split(",").map do |name|
            Tag.find_or_create_by_name(name.strip)
          end
        end
      end
      private :update_tags
    end
    

    我想在我的标记名上添加验证,但我不确定最好的方法是什么。我在标记模型中定义了一个现有的验证方法:

    class Tag < ActiveRecord::Base
      has_many :entry_tags
      has_many :entries, :through => :entry_tags
    
      validates_uniqueness_of :name
      validates_format_of :name, :with => /\A[a-z0-9_ -]*\Z/, :on => :create
    end
    

    但是,因为 update_tags 方法在保存后被调用,任何来自创建的验证错误都将在条目已保存后被调用。

    我正在考虑在条目模型中创建一个验证方法,并在条目保存时调用它,但是:

    1. 如果我这样做,我不确定进行验证的最佳方法是什么。我是否在 Entry 或创建一个 Tag 每个名称和检查的对象 t.valid? ?我能从中收集验证错误消息吗? 标签 或者生成它们?
    2. 我不确定这是否是进行这种验证的正确方法。

    有什么建议吗?

    2 回复  |  直到 11 年前
        1
  •  3
  •   nakajima    15 年前

    如果你还没有排除它,我会看看使用 validates_associated .

        2
  •  0
  •   Marek Maurizio    11 年前

    尝试向关联添加无效项时会出现此错误。一个可能的原因是,您在输入数据后向关联模型添加了验证,而您当前在数据库中的值无效。