datetime_selectのパラメータ
ほんまかいなと思うのだが今のとことりあえず値は取れたので一応メモ。
一応だらけでちゃんとした理解が出来てないような気がしてならないが…
ARインスタンスであろうとなかろうとselectやら、ARインスタンスなら
datetime_selectなどで日付枠を作成することがある。あんまりやらない
とかセオリーじゃなかったら突っ込んでもらいたいとこだけど…
まあとりあえずそうなると生成されたHTMLは別名をつけてしまう。
testForm.rhtml
<label for="search_date"><%= Incident.human_attribute_name("search_date") %></label> <%= datetime_select 'test_item', 'search_date' , {:use_month_numbers=>true, :include_blank => true} %>
上記の初期値空欄というのとあわせてこんな感じ。
これで生成されたHTML
<tr> <td class="TestLabel"> <label for="search_date">検索日時</label> </td> <td><select id="test_item_search_date_1i" name="test_item[search_date(1i)]"> <option value=""></option> <option value="2002">2002</option> <option value="2003">2003</option> <option value="2004">2004</option> <option value="2005">2005</option> <option value="2006">2006</option> <option value="2007">2007</option> <option value="2008">2008</option> <option value="2009">2009</option> <option value="2010">2010</option> <option value="2011">2011</option> <option value="2012">2012</option> </select>
この(1i)というのが年を意味してるのは見ればわかるが、
じゃあparamsはどうやって組み上げているんだろうか?
結論から言うとここはちょっと見てもわからなかったorz
で、この下の月とかは2iになっているわけで。
シンボルなのかと思ってcontrollerでこんな風にすると
test = params[:test_item][:search_date][:1i]
実行するまでもなくこれはシンボルの指定がおかしい。じゃあ
[:search_date(1i)]?これもエラーになる。じゃあ基本に立ち返れとおっしゃるか。
test = params[:test_item]["search_date(1i)"].to_i
成功。なんかきちゃないって感じなんだがとりあえず値は取れた…
適当にnewアクションの流れとか見ていたのだが、そのあたりは
Item.new(params[:item])
の中でよろしくやられてしまっていてよくわからない。もう少しソース
おっかけるなりなんなりすればいいと思うけど今そこまで首突っ込めない
のでこれも一旦メモということに。
でも1iとかそういう指定の仕方ってベタ書きっぽくてどうなんだろうと
いうとこだけはどうしても気になったのでdate_helper.rbだけ見る。
private def date_or_time_select(options) defaults = { :discard_type =&amp;gt; true } options = defaults.merge(options) datetime = value(object) datetime ||= Time.now unless options[:include_blank] position = { :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6 } order = (options[:order] ||= [:year, :month, :day]) ....
わかった。君の勝ちだ。ということで1iとかは納得するしかない。
ただこういう流れで分割してるのならどこかで元に戻してると思う
のだがそれっぽいメソッドないのかな。調べる時間が欲しくてしょうがない…