YUI (Yahoo! UI Library) on Rails : Calendar (2)
- カレンダーで選択した日付をフォームに表示させ,それをSubmitする.
- バレンタインデーがフォームに表示された.
(コードは↓)
ビュー
- 全ページに適応されるように,/views/layouts/books.rhtml にJavaScriptをかく
[/views/layouts/books.rhtml] <head> <script> YAHOO.namespace("example.calendar"); function handleSelect(type,args,obj) { var dates = args[0]; var date = dates[0]; var year = date[0], month = date[1], day = date[2]; var selMonth = document.getElementById("selMonth"); var selDay = document.getElementById("selDay"); var selYear = document.getElementById("selYear"); selMonth.selectedIndex = month; selDay.selectedIndex = day; for (var y=0;y<selYear.options.length;y++) { if (selYear.options[y].text == year) { selYear.selectedIndex = y; break; } } } function updateCal() { var selMonth = document.getElementById("selMonth"); var selDay = document.getElementById("selDay"); var selYear = document.getElementById("selYear"); var month = parseInt(selMonth.options[selMonth.selectedIndex].text); var day = parseInt(selDay.options[selDay.selectedIndex].value); var year = parseInt(selYear.options[selYear.selectedIndex].value); if (! isNaN(month) && ! isNaN(day) && ! isNaN(year)) { var date = month + "/" + day + "/" + year; YAHOO.example.calendar.cal1.select(date); YAHOO.example.calendar.cal1.cfg.setProperty("pagedate", month + "/" + year); YAHOO.example.calendar.cal1.render(); } } function init() { YAHOO.example.calendar.cal1 = new YAHOO.widget.Calendar("cal1","cal1Container"); YAHOO.example.calendar.cal1.selectEvent.subscribe(handleSelect, YAHOO.example.calendar.cal1, true); YAHOO.example.calendar.cal1.render(); YAHOO.util.Event.addListener(["selMonth","selDay","selYear"], "change", updateCal); } YAHOO.util.Event.addListener(window, "load", init); </script> </head>
- 書き込みフォームのページにカレンダ表示を挿入
[/views/books/new.rhtml] <div id="cal1Container"></div>
- フォームのヘルパに select をベタ書き
- 今回は,Rails側を修正することで,selMonth などをそのまま使ったが,JavaScript側を修正すれば,ベタ書きせずに済むはず
[views/books/_form.rhtml] <p><label for="date_on">date_on</label><br/> <select id="selMonth" name="selMonth"> <option value="" selected> </option> <option value="1">1</option> <option value="2">2</option> … <option value="11">11</option> <option value="12">12</option> </select> <select id="selDay" name="selDay"> <option value="" selected> </option> <option value="1">1</option> <option value="2">2</option> … <option value="30">30</option> <option value="31">31</option> </select> <select id="selYear" name="selYear"> <option value="" selected> </option> <option value="2006">2006</option> <option value="2007">2007</option> <option value="2008">2008</option> </select>
コントローラ
- フォームからの値を @book.date_on にセットする
[app/controllers/books_controller.rb] def create #Calendar today = Date.new(params[:selYear].to_i, params[:selMonth].to_i, params[:selDay].to_i) @book.date_on = today end