首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何列出没有绑定到一个属性的DataMapper错误?

我如何列出没有绑定到一个属性的DataMapper错误?
EN

Stack Overflow用户
提问于 2012-04-05 20:51:18
回答 2查看 226关注 0票数 1

DataMapper模型允许两种形式的自定义验证:特定于属性的验证和整体对象验证。例如:

代码语言:javascript
复制
 # 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)

EN

回答 2

Stack Overflow用户

发布于 2012-04-05 21:16:30

一成不变的方式

我希望还有比这更本土化的方式。我已将此方法添加到我的模型中:

代码语言:javascript
复制
# 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

在表格的顶部,我可以这样做:

代码语言:javascript
复制
- if @my_model.general_validation_errors.any?
  .errors
    %ul
      - @my_model.general_validation_errors.each do |error_message|
        %li= error_message

或者,用于支持f.general_validation_errors的猴子修补程序是:

代码语言:javascript
复制
# 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
EN

Stack Overflow用户

发布于 2016-09-09 18:34:50

为了展示..。你可以用闪光灯吗?

由于您还没有标记语言,所以我只会将Ruby和Sinatra的内容放在一起,也许您可以找到与DSL相当的语言。

flash.now[:errors]在您的视图中有相关的条件语句

在路线上flash[:errors] = User.errors

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10035830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档