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... ]