2012-04-05 48 views
1

DataMapper模型允许两种形式的自定义验证:特定于属性的验证和整体对象验证。例如:如何列出与一个属性无关的DataMapper错误?

# Validates the `name` property with the `check_name` method; 
# any errors will be under `object.errors[:name]` 
validates_with_method :name, method: :check_name 

# Validates the object overall with the `overall_soundness` method; 
# any errors will be under `object.errors[:overall_soundness]` 
validates_with_method :overall_soundness 

第二种类型对于涉及多个属性的验证有意义,但也会出现问题:向用户显示错误。

我想显示所有未附加到表单页面顶部的特定属性的错误,但我没有看到任何简单的方法列出它们。

我该如何获得非特定于财产的错误列表?

(我使用的DataMapper 1.2.0)

回答

0

哈克方式

我希望能有比这更原始的方式。我已经添加了这个方法我的模型:

# 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 
+0

或者您也可以按名称挑你的特殊的错误,比如'special_overall_soundness'你的看法。 “validates_with_method”的文档鼓励您一次使用一个属性/方法。 – ujifgc 2012-04-05 21:29:32

+0

或者,如果你想让你的代码在DataMapper 1.3上中断,你可以通过'Model.validators.contexts [:default] .select {| k | k.kind_of? DataMapper :: Validations :: MethodValidator}' – ujifgc 2012-04-05 21:46:48

+0

@ujifgc - 我**一次一个验证一个验证,但我想将它们全部列在一个地方供用户使用。我已经在表单字段旁列出了特定于字段的错误;我希望这些其他人都在顶部列表中。另外,'Model.validators.context [:default] .select {| k | k.kind_of?(DataMapper :: Validations :: MethodValidator)'返回所有验证,不区分字段特定和其他。它们每个都有'field_name'属性,但是'general'验证在那里没有nil;它们有自己的名字,所以这对我没有帮助。 – 2012-04-09 16:00:07

0

用于显示...您可以使用闪存?

既然你没有标记一种语言,我只会把Ruby和Sinatra的东西,也许你可以找到DSL的等价物。

flash.now[:errors]符合相关条件语句

和路线flash[:errors] = User.errors