【问题标题】:Rails Serialized Data ValidationsRails 序列化数据验证
【发布时间】:2011-04-20 21:50:30
【问题描述】:

我有一个通过默认 AR 行为序列化为 YAML 的字段。例如,它当前位于哈希数组中:

[{'name' => 'hi', 'url' => 'bye'}, 
 {'name' => 'hi', 'url' => 'bye'}, 
 {'name' => 'hi', 'url' => 'bye'}]

有没有一种方法可以在其中一些字段上使用一些基本的 AR 验证?

【问题讨论】:

    标签: ruby-on-rails serialization


    【解决方案1】:

    在模型中

    store :field_name, :name
    store :field_name, :url
    
    validates :name, presence: true
    validates :url, presence: true
    

    它还会为您提供属性访问器,因此您可以像使用普通字段一样使用它们:

    object.name = 'some value' # reader
    object.name # writer
    object.url = 'some url' # reader
    object.url # writer
    

    【讨论】:

      【解决方案2】:

      将其留在这里以防将来对任何人有所帮助 - 我编写了一个 gem 来更好地处理验证序列化属性。您可以按照您可能期望的方式将这些验证放在块语法中:

      serialize :urls
      validates_hash_keys :urls do
        validates :name, presence: true
        validates :url, presence: true
      end
      

      https://github.com/brycesenz/validates_serialized

      【讨论】:

        【解决方案3】:

        是的,使用validates_each 方法

        serialize :urls
        validates_each :urls do |record, attr, value|
          # value is an array of hashes
          # eg [{'name' => 'hi', 'url' => 'bye'}, ...]
        
          problems = ''
          if value
            value.each{|name_url| 
              problems << "Name #{name_url['name']} is missing its url. " \
                unless name_url['url']}
          else
            problems = 'Please supply at least one name and url'
          end
          record.errors.add(:urls, problems) unless problems.empty?
        end
        

        补充:不能使用validates_length_of等验证,因为验证方法不理解序列化字段的格式。

        validates_each 方法很好,因为它使您能够编写自己的验证方法。然后,该方法可以在适当的情况下将错误添加到记录中。

        提示:您还可以将错误添加到 record.errors 的 :base 而不是特定属性。有时这可以帮助您格式化视图中的错误消息。

        【讨论】:

          猜你喜欢
          • 2014-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多