赤き血のイレブン

自分の復習ネタを書いてます。

actionviewのヘルパー(date_selectってなんじゃこりゃ〜)

雑談

東アジアカップは女子は一矢報いたけど、男子は全然でしたね。。。 そんな中、我らが武藤くんは2ゴールとしっかり結果を出してくれました!

今後のワールドカップ予選も期待ですね!

本題

さてさて、最近date_selectというメソッドを見つけたのでちょっと試してみました!

利用シーン

ユーザの情報などで誕生日(birthday)のような日付データ(date型)を保持するモデルがあるとして フォームでその誕生日をセレクトボックスで作るときにいちいち年、月、日と3つも作るの大変ですよね! そんなのrailsでやりたくない!ってことで標準であるみたいです。(うれしいですね)

使い方

使い方ですが、ビューでこんなかんじですかね。

= date_select :person, :birth_date

とすると

<select id="person_birth_date_1i" name="person[birth_date(1i)]"> ... </select>
<select id="person_birth_date_2i" name="person[birth_date(2i)]"> ... </select>
<select id="person_birth_date_3i" name="person[birth_date(3i)]"> ... </select>

おぉー。ちゃんと分かれてる。

あれ、パラメータ名がperson[birth_date(1i)]、person[birth_date(2i)]、person[birth_date(3i)]に変わってるやん! まじか。。。

でも、ちゃんと保存されてるし、どーなってんの?

新たな刺客、マルチパラメータ

実は、activerecord内部でマルチパラメータというものがあって これが、birthdayをがっちゃんこしてくれているそうです!

github.com

この辺りのソースを読むと カラム名+数字+(i or f)という感じのパラメータにするとまとめてくれるそうな。

birth_date(1i)は * birth_dateは元々のパラメータ名で * 数字の1は一つ目 * iはinteger型に変換(日付は分解するとそれぞれ数値なので) に分解できる。

で、丸かっこもフォーマットとしては必要みたいです。

今回のヘルパーは、activerecordの機能を前提とした実装だということがわかってめでたしめでたしでした!