为 rails 中的哈希参数数组编写验证
Writing validations for an array of hashes parameter in rails
我有一个新的 API 属性,它是一个散列数组,我想将其作为内置 rails 验证的一部分进行验证。由于这是一个复杂的对象,我正在验证我没有找到任何有效的例子来参考。
参数名称是 books
,它是一个散列数组,每个散列具有三个属性 genre
应该是三个可能值的枚举,authors
应该是一个整数数组和 bookId
应该是一个整数。
像这本书:[{bookId: 4, genre: "crime", authors: [2, 3, 4]}]
如果它类似于数组,我可以在此处查看它的文档 https://guides.rubyonrails.org/active_record_validations.html,但我没有找到上述情况的任何示例。
我正在使用 rails 4.2.1 和 ruby 2.3.7 如果你能帮助我从某个地方开始,那就太好了。
具体来说,枚举验证我在这里找到了一个很好的答案How do I validate members of an array field?。问题是当我需要在哈希数组中使用它时。
你可以自己写一个简单的custom validation method。这样的事情可能是一个好的开始:
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
我有一个新的 API 属性,它是一个散列数组,我想将其作为内置 rails 验证的一部分进行验证。由于这是一个复杂的对象,我正在验证我没有找到任何有效的例子来参考。
参数名称是 books
,它是一个散列数组,每个散列具有三个属性 genre
应该是三个可能值的枚举,authors
应该是一个整数数组和 bookId
应该是一个整数。
像这本书:[{bookId: 4, genre: "crime", authors: [2, 3, 4]}]
如果它类似于数组,我可以在此处查看它的文档 https://guides.rubyonrails.org/active_record_validations.html,但我没有找到上述情况的任何示例。
我正在使用 rails 4.2.1 和 ruby 2.3.7 如果你能帮助我从某个地方开始,那就太好了。
具体来说,枚举验证我在这里找到了一个很好的答案How do I validate members of an array field?。问题是当我需要在哈希数组中使用它时。
你可以自己写一个简单的custom validation method。这样的事情可能是一个好的开始:
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