ActiveRecordで取得したテーブルのデータから選択リスト(プルダウン)を作成したいと思ったんです。
出張費精算のアプリを作っていて、"http://localhost/home/list/200707"というURLにアクセスすると、2007年7月のリストを出力する仕様になっています。これにプルダウンで月の選択をすると、リストが切り替わる様にしたいんです。
テーブルは月別の出張費精算テーブルで、こんな構成。
create_table(:monthly_expenses, options) {|table|
table.column :employee_id, :integer
table.column :appropriate_month, :date
table.column :period_from, :date
table.column :period_to, :date
table.column :total_amount, :integer
table.column :prepayment, :integer
table.column :report_date, :date
table.column :status, :integer
table.column :time_stamp, :datetime
}
選択リストはこの月別のリストを切り替える為に使いたいので、欲しいのは、" appropriate_month"だけだったりします。
ずいぶんと余分なモノが混じってしまっています。それだけならまだしも、URLとして使う都合上、"yyyy-MM-dd"形式ではなくて、"yyyyMM"を取得したい。選択リストのテキストには"yyyy年MM月"としてあげたい。
どうやっても変換をかける必要があるんですが、出来ればSQLを書かずにすませたい(単なるこだわりです)。
ActiveRecordに取得カラムを指定は出来ない様子。オブジェクト化するから、当然なんですけど。
取得結果をブロックで処理して、mapしてあげることにしました。
@monthly_list =
MonthlyExpense.find(:all,
:conditions => ["employee_id = ?", employee_id],
:order => "appropriate_month"
).map { |m| [m.appropriate_month.strftime("%Y年%m月"),
m.appropriate_month.strftime("%Y%m")] }
あとは、rhtml側で、ActionHelperを使って、
としてあげれば、OK。 ではなくて、初期値を設定してあげないといけない。 selectの場合は、@month.valueに入っている値がリストにあれば、それを選択状態にしてくれるのですが・・・ monthオブジェクトはselectタグ内部で作成されていので、コントローラー側でセットしようにもオブジェクトが存在しない。 動的にオブジェクトを作成するほうほうが思い浮かばなかったので、クラス定義をしてまいました。<%= select(:month, :value, @monthly_list) %></pre>
すっごく強引な気がするけど、後で思いついたら直すことに。 最後にonChangeのイベントをとってリクエストを投げて挙げるように修正。 prototype.jsのEvent.observeを使う。class Month attr_accessor :value end
@month = Month.new @month.value = @monthly_expense.appropriate_month.strftime("%Y%m")
Event.observe($('month_value'),
"change",
function(){
document.location.href = "/home/list/" + escape($F('month_value'));
});
これで一応動作を確認。なんかもっと上手くできる気がするんですけどね。
とりあえず動けば官軍って言うんでこれで我慢します。
上記の画面には2行のテーブルがあって、
交通費、宿泊費、その他の3レコードが含まれています。つまり3×2で6レコードです。
普通にerror_messages_forだとチェック自体は行われますが、エラーメッセージが最後の1レコード分しか出ませんでした。
というわけで、すべてのレコードのエラーを拾って重複を排除して表示する用にしてみました。
app/helpers/application_helperにメソッドを追加してもいいんですが、最近ActiveHeartを入れたばかりなので、
vender/plugin/active_heart/lib/active_recorde_message_ja.rbのerror_messages_forの下に下記コードを追加しておきました。
エラーチェック自体は相変わらず適当(あえてエラー出しています)なのですが・・・
が、またしても此処で問題が。
詳細の項目には:allow_nilでnilやブランクの場合はチェックしないようにしているんですが、何故かチェックされてしまいます。他の所はちゃんと動作しているのに・・・
近々攻略予定です。
項目名が英語のまま。
これを日本語化するには、
validateの内容は適当なんで突っ込まないでください。
”詳細”が数値ってなんの詳細だよ・・・
ところで、validatesの:allow_nilオプションなんですが、これを付けるとnilの場合はvalidateおこなわないんですねぇ。
なんでこんな重要な事早く言わないかなぁ。APIドキュメント見るまで気がつかなかった。単に、