首页 > 解决方案 > 在 rails 中为哈希参数数组编写验证

问题描述

我有一个新的 API 属性,它是一个哈希数组,我想将其作为内置 rails 验证的一部分进行验证。由于这是一个复杂的对象,我正在验证我没有找到任何有效的示例可供参考。

参数名称是books哈希数组,每个哈希具有三个属性genre,它们应该是三个可能值的枚举,authors应该是整数数组,bookId应该是整数。

像这样的书:[{bookId: 4, genre: "crime", authors: [2, 3, 4]}]

如果它类似于数组,我可以在这里看到它的文档https://guides.rubyonrails.org/active_record_validations.html但我没有找到上述场景的任何示例。

我正在使用带有 ruby​​ 2.3.7 的 rails 4.2.1,如果你能帮助我从某个地方开始,那就太好了。

具体来说,枚举验证我确实在这里找到了一个很好的答案如何验证数组字段的成员?. 问题是当我需要在哈希数组中使用它时。

标签: ruby-on-railsrubyvalidationruby-on-rails-4

解决方案


您可以自己编写一个简单的自定义验证方法。这样的事情可能是一个好的开始:

validate :format_of_books_array

def format_of_books_array
  unless books.is_a?(Array) && books.all? { |b| b.is_a?(Hash) }
    errors.add(:books, "is not an array of hashes") 
    return
  end

  errors.add(:books, "not all bookIds are integers")  unless books.all? { |b| b[:bookId].is_a?(Integer) }
  errors.add(:books, "includes invalid genres")       unless books.all? { |b| b[:genre].in?(%w[crime romance thriller fantasy]) }
  errors.add(:books, "includes invalid author array") unless books.all? { |b| b[:authors].is_a?(Array) && b[:authors].all? { |a| a.is_a?(Integer) } }
end

推荐阅读