2012-04-05 10 views
1

DataMapperモデルでは、プロパティ固有の検証とオブジェクト全体の検証という2つのフォームのカスタム検証が可能です。例:1つのプロパティに関連付けられていないDataMapperエラーを一覧表示するにはどうすればよいですか?

2番目のタイプは、複数のプロパティを含む検証には意味がありますが、ユーザーにエラーを表示するという問題もあります。

特定のプロパティに添付されていないすべてのエラーをフォームのページの上部に表示したいと思いますが、簡単な方法は表示されません。

プロパティ固有ではないエラーのリストを取得するにはどうすればよいですか?

(私はDataMapperの1.2.0を使用しています)

答えて

0

ハック方法

私はこれ以上のネイティブな方法があります願っています。 I私のモデルにこのメソッドを追加しました:f.general_validation_errorsは次のようになり許可するFormtasticに

- if @my_model.general_validation_errors.any? 
    .errors 
    %ul 
     - @my_model.general_validation_errors.each do |error_message| 
     %li= error_message 

あるいは、モンキーパッチ:

# 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 

フォームの上部には、私はこれを行うことができます

# 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' 'のように、名前であなたの特別なエラーを選ぶことができ中であなたのビューで

flash.now[:errors]。 'validates_with_method'のドキュメントは、一度に一つのプロパティ/メソッドでそれを使うことを奨励しています。 – ujifgc

+0

また、DataMapper 1.3でコードを中断したい場合は、 'Model.validators.contexts [:default] .select {| k | k.kind_of? DataMapper :: Validations :: MethodValidator} ' – ujifgc

+0

@ujifgc - 私は**バリデーションを一度に**宣言していますが、私はそれらをユーザーのために1か所にまとめたいと思います。フォームフィールドの横にフィールド固有のエラーをリストしています。私はこれらの他のものを全て一番上のリストに入れておきたい。また、 'Model.validators.context [:default] .select {| k | k.kind_of?(DataMapper :: Validations :: MethodValidator) 'は、フィールド固有のものとそれ以外のものを区別せず、すべてのバリデーションを返します。それぞれに' field_name'プロパティがありますが、 '一般'バリデーションにはnilはありません。それは私を助けません。 –

0

表示用に、Flashを使用できますか?

あなたは言語にタグを付けていないので、私はRubyとSinatraのものを入れて、DSLに相当するものを見つけることができます。関連する条件文

とルートflash[:errors] = User.errors

関連する問題