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

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