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