哈克方式
我希望能有比这更原始的方式。我已经添加了这个方法我的模型:
# Validation errors not tied to a specific property. For instance,
# "end date must be on or before start date" (neither property is
# wrong individually, but the combination makes the model invalid)
# @return [Array] of error message strings
def general_validation_errors
general_errors = []
general_error_keys = errors.keys.reject do |error|
# Throw away any errors that match property names
self.send(:properties).map(&:name).include?(error) || error == :error
end
general_error_keys.each do |key|
general_errors << self.errors[key]
end
general_errors.flatten
end
在窗体的顶部,我可以这样做:
- if @my_model.general_validation_errors.any?
.errors
%ul
- @my_model.general_validation_errors.each do |error_message|
%li= error_message
或者,猴子补丁Formtastic允许f.general_validation_errors
是:
# Let Formtastic forms use f.general_validation_errors to display these (if any)
module Formtastic
module Helpers
module ErrorsHelper
def general_validation_errors
unless @object.respond_to?(:general_validation_errors)
raise ArgumentError.new(
"#{@object.class} doesn't have a general_validation_errors method for Formtastic to call (did you include the module?)"
)
end
if @object.general_validation_errors.any?
template.content_tag(:div, class: 'errors') do
template.content_tag(:ul) do
content = ''
@object.general_validation_errors.each do |error|
content << template.content_tag(:li) do
error
end
end
content.html_safe
end
end
end
end
end
end
end
或者您也可以按名称挑你的特殊的错误,比如'special_overall_soundness'你的看法。 “validates_with_method”的文档鼓励您一次使用一个属性/方法。 – ujifgc 2012-04-05 21:29:32
或者,如果你想让你的代码在DataMapper 1.3上中断,你可以通过'Model.validators.contexts [:default] .select {| k | k.kind_of? DataMapper :: Validations :: MethodValidator}' – ujifgc 2012-04-05 21:46:48
@ujifgc - 我**一次一个验证一个验证,但我想将它们全部列在一个地方供用户使用。我已经在表单字段旁列出了特定于字段的错误;我希望这些其他人都在顶部列表中。另外,'Model.validators.context [:default] .select {| k | k.kind_of?(DataMapper :: Validations :: MethodValidator)'返回所有验证,不区分字段特定和其他。它们每个都有'field_name'属性,但是'general'验证在那里没有nil;它们有自己的名字,所以这对我没有帮助。 – 2012-04-09 16:00:07