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

rails:724

From: Hiroshi Takagi <gollum@h...>
Date: Sat, 03 Dec 2005 20:33:32 +0900
Subject: [rails:724] 悩ましい日付型, date_select, select_date

たかぎです。


Rails で日付型カラムを含むテーブルを扱う場合にぶつかった問題と、
対処方法について相談させてください。


テーブルに、shipping_date   date
のような日付型のカラムがあると、scaffold は、

<%= date_select 'model_class_name', 'shipping_date'  %>

のように date_select() を使った _form.rhtml を生成します。
この date_select() や select_date はフォーム上では、

<select name="model_class_name[shipping_date(1i)]">
<option value="2000">2000</option>
.....
<select name="model_class_name[shipping_date(2i)]">
<option value="1">January</option>
.....
<select name="model_class_name[shipping_date(3i)]">
<option value="1">1</option>
....
<option value="31">31</option>
.....

と、3 つの selection list を作ります。
これが困ったやつで。

2005-11-31
2005-2-31

のように日付として不正な選択をしてフォームから 
create/update などを実行すると、

ActiveRecord::MultiparameterAssignmentErrors 

が raise してしまいます。

これは、フォームからのparams から、
model_class のインスタンスをnew/update するタイミングで発生しますので、
model_class 中に validate を書いても止められません。
3 つの文字列から日付に変換する時点のエラーなのでしょう。

日付を扱うフォームのアプリケーションを作成されている方、
フォームからの日付項目の入力・修正、どうされていますか?

わたしは、以下のような 下品な workaround で逃げてしまったのですが、
ほかによい方法があれば、教えてください。

1. date 型のカラムがあるテーブルには、そのカラムに対応した
 入力・修正用のvarchar型カラムを作っておく。

    ex.) shipping_date  --> shipping_date_s

2. form 上では、select_date, date_select は使わない。
   (年月までの選択なら使いますが。)

3. model 中に以下のような validate と文字->日付変換methodを定義しておく。

  def validate
    begin
      Date.parse(self.b_shipping_date_s)
    rescue ArgumentError
      errors.add(:shipping_date_s, "invalid date")
    end
  end

  def before_save
    self.shipping_date = Date.parse(self.shipping_date_s)
    self.shipping_date_s = self.shipping_date.strftime("%Y-%m-%d")
  end

DBテーブルに入力用のフィールドがでかい顔して居座っているのは、
実に美しくないのですが、フォーム上での validation message がまとめられる
ので、こういうかたちにしちゃいました。

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