rails:733
From: Hiroshi Takagi <gollum@h...>
Date: Sun, 04 Dec 2005 18:26:05 +0900
Subject: [rails:733] Re: 悩ましい日付型, date_select, select_date
高木宏です。 On Sun, 04 Dec 2005 15:02:16 +0900 Kazuhiro Yoshida <moriq@m...> wrote: > もりきゅうです。 (snip) > attributes= の中ですね。 そうなのですよ。 > これは面白い問題ですね。調べてみました。 興味をもっていただいてありがとうございます。 (snip) > 結局 attributes= と valid? をハックすればいいので hack せずに、迂回・回避ばかり考えてすみません(汗 > まとめてプラグイン形式で書くと次のように書けます。 > これを適用すれば元の Controller のままでok。 #731 の訂正も含めて、以下のように書いてみました。 なまえは、勝手に mpaerr として。 以下のような Date 型カラムを二つ含むテーブルでも、 うまくいきました。 create table contracts ( id int not null auto_increment, name varchar(64) not null, start_date date not null, expiration_date date not null, primary key (id) ); 二つのカラム start_date, expiration_date のどちらかあるいは両方に不正な 日付を入れると、きちんと、 Start date error on assignment [2006, 2, 30] to start_date Expiration date error on assignment [2009, 6, 31] to expiration_date と個別にエラーメッセージが出力され、 select_date の当該フィールドがハイライトされました。 ただ、難点が二つ。 1. render :action => 'new' もしくは render :action => 'edit' でエラーメッセージとともに最表示されたフォーム上では、 不正な日付が入力されたフィールドの値は、デフォルトのDate.todayに なってしまっており、どんな間違いを起したのかわからない。 2. ActiveHeart を使っている時、同じ芸風で日本語のバリデーション メッセージを登録するにはどうしたらよいでしょうか。 TIA. :-) -------- 以下、作成したplugin ------ ## project_dir/vendor/lib/plugins/mpaerr/init.rb require_dependency 'mpaerr' ActiveRecord::Base.class_eval do alias_method :set_attributes_without_multiparam_validation, :attributes= alias_method :attributes=, :set_attributes_with_multiparam_validation alias_method :valid_p_without_multiparam_validation, :valid? alias_method :valid?, :valid_p_with_multiparam_validation end ## project_dir/vendor/lib/plugins/mpaerr/lib/mpaerr.rb module ActiveRecord class AttributeAssignmentError < ActiveRecordError #:nodoc: def initialize(message, exception, attribute) 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 def multiparam_errors @multiparam_errors ||= [] end def add_multiparam_errors multiparam_errors.each do |error| errors.add(error.attribute, error.message) 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... ]