[前][次][番号順一覧][スレッド一覧]

rails:739

From: Hiroshi Takagi <gollum@h...>
Date: Mon, 05 Dec 2005 00:49:50 +0900
Subject: [rails:739] Re: 悩ましい日付型, date_select, select_date

高木宏です。


On Sun, 04 Dec 2005 19:44:44 +0900
Kazuhiro Yoshida <moriq@m...> wrote:

> もりきゅうです。
> 
> Hiroshi Takagi <gollum@h...> wrote:
> > 1. render :action => 'new' もしくは render :action => 'edit' 
> > でエラーメッセージとともに最表示されたフォーム上では、
> > 不正な日付が入力されたフィールドの値は、デフォルトのDate.todayに
> > なってしまっており、どんな間違いを起したのかわからない。
> 
> ああ。Date には入らないですね。date_helper をいじるのは面倒なので、
> フェイクオブジェクトに値を入れて渡せばいいかな。

ということで、

>       HOLDER_CLASSES = {
>         Date => Struct.new("DateHolder", :year, :month, :day)
>       }

と、

>             rescue => ex
>               send(name + "=", HOLDER_CLASSES[klass].new(*values))
>               errors << AttributeAssignmentError.new(nil, ex, name, values)
>             end

なのですね。

大作、ありがとうございました。
今度はばっちりです。

> > 2. ActiveHeart を使っている時、同じ芸風で日本語のバリデーション
> > メッセージを登録するにはどうしたらよいでしょうか。
> 
> AttributeAssignmentError を書き換えていただければ。

この

>       # message ||= "error on assignment #{values.inspect} to #{attribute}"
>       message ||= " #{values.inspect} は不正な値です"

二行目のように、ですね。
これもばっちりです。

> 芸風を合わせるなら @@default_error_messages を使うようにしてみてください。:)

よく考えると、同じ芸風は無理ですねぇ〜(^^;

ActiveHeart は、lib/active_record_messages_ja.rb 中で、

  default_error_messages.update({
    :inclusion => "はリストに含まれてません",  
    .....

と、@@default_error_messages を書き換えてますが、
この :inclusion などのシンボルは、ActiveRecord::Validations で
def validates_xxx と対応づけられていますから。
新しい validates_xxx を作るのもなんかへん。

#この場合は、入力値のvalidation というより、一種のエラーですからねぇ。

わたしは日本人なんで、
エラーメッセージを日本語でハードコードしてもかまわないのですが、
せっかくできたこのプラグインは、けっこういけてると思うので、
メッセージは英語のまま公開されてもよいのでは?。

(メッセージの多国語化に統一的な方法を提供していないのが問題やなぁ。)

>       HOLDER_CLASSES = {
          Time => Struct.new("TimeHolder", :year, :month, :day, :hour, :min, :sec),
>         Date => Struct.new("DateHolder", :year, :month, :day)
>       }

> Time はたぶんこれで通るはず。minute メソッドが要るか微妙。

Time はとおりましたが、
2005, 6, 31, 0, 41 を指定すると、
2005-07-01 00:41 になって受け付けてしまいます。

これは、かずひこさんが #726 で指摘されてた「裏技」というか
Time の仕様のせいか、どうしようもないようですね。

ありがとうございました。


---- 以下にもりきゅうさんの lib/mpaerr.rb をまとめます。

module ActiveRecord
  class AttributeAssignmentError < ActiveRecordError #:nodoc:
    def initialize(message, exception, attribute, values=nil)
      message ||= " #{values.inspect} が正しくありません。"
      super message
      @exception = exception
      @attribute = attribute
    end
  end

  class Base
    def set_attributes_with_multiparam_validation(attributes)
      multiparam_errors.clear
      begin
        set_attributes_without_multiparam_validation(attributes)
      rescue MultiparameterAssignmentErrors => e
        multiparam_errors.concat e.errors
      end
    end

    def valid_p_with_multiparam_validation
      ret = valid_p_without_multiparam_validation &&
            multiparam_errors.empty?
      add_multiparam_errors
      ret
    end

    private

      HOLDER_CLASSES = {
        Time => Struct.new("TimeHolder",
                             :year, :month, :day, :hour, :min, :sec),
        Date => Struct.new("DateHolder", :year, :month, :day)
      }

      def multiparam_errors
        @multiparam_errors ||= []
      end

      def add_multiparam_errors
        multiparam_errors.each do |error|
          errors.add(error.attribute, error.message)
        end
      end

      def execute_callstack_for_multiparameter_attributes(callstack)
        errors = []
        callstack.each do |name, values|
          klass = (self.class.reflect_on_aggregation(name) ||
                   column_for_attribute(name)).klass
          if values.empty?
            send(name + "=", nil)
          else
            begin
              send(name + "=",
                   Time == klass ? klass.local(*values) : klass.new(*values))
            rescue => ex
              send(name + "=", HOLDER_CLASSES[klass].new(*values))
              errors << AttributeAssignmentError.new(nil, ex, name, values)
            end
          end
        end

        unless errors.empty?
          raise MultiparameterAssignmentErrors.new(errors),
                "#{errors.size} error(s) on assignment of multiparameter attributes"
        end
      end
  end
end

-- 
Hiroshi Takagi <gollum@h...>



--
ML: rails@r...
使い方: http://QuickML.com/
Web Site: http://wiki.fdiary.net/rails/
ML Archives: http://www.fdiary.net/ml/rails/

[前][次][番号順一覧][スレッド一覧]

       724 2005-12-03 12:33 [gollum@h...         ] 悩ましい日付型, date_select, select_date
       725 2005-12-03 12:49 ┣[osakanas@g...       ]                                       
       726 2005-12-03 13:42 ┃┣[kazuhiko@f...       ]                                     
       727 2005-12-03 13:59 ┃┗[gollum@h...         ]                                     
       729 2005-12-04 07:02 ┗[moriq@m...          ]                                       
       730 2005-12-04 07:09  ┣[moriq@m...          ]                                     
       731 2005-12-04 07:30  ┣[moriq@m...          ]                                     
       733 2005-12-04 10:26  ┗[gollum@h...         ]                                     
       734 2005-12-04 11:44   ┗[moriq@m...          ]                                   
       735 2005-12-04 11:56    ┣[moriq@m...          ]                                 
->     739 2005-12-04 16:49    ┗[gollum@h...         ]