TodoList: ActionPack にバグあり ― 2007年01月09日 12時08分03秒
以前に、所属組織 (Organization) への公開情報を指定できるようにしたときや、ユーザ (User) に所属団体 (Organization) を割り当てられる様にした時に <%= select ... %>
を使ったが、:selected =>
を指定すると、動作がおかしかった。後者の場合は、私の引数が間違ってはいなかったが、好ましい値でなかったので、引数を変えたら直った。しかし、前者の方はどうしても意図したように動かないのである。
description で、言語 (Language) を選べるようにする。以下の書式だと正しく ActionPack が動作する。
<%= select :description, :language_id,
Language.find(:all).map {|l| [ l.name, l.id ]},
{},
{}
%>
以下のが上記のコードから生成された HTML だ。この場合、English に対応する 1 が初期値になっている。
<select id="user_language_id" name="user[language_id]">
<option value=""></option>
<option value="1" selected="selected">English</option>
<option value="2">Japanese</option>
</select>
これを、わざと初期値が 2 の日本語 (Japanese) にする為に :selected
を追加する。
<%= select :description, :language_id,
Language.find(:all).map {|l| [ l.name, l.id ]},
{},
{ :selected => "2" }
%>
以下のが上記のコードから生成された HTML だ。
<select id="user_language_id" name="user[language_id]" selected="2">
<option value=""></option>
<option value="1">English</option>
<option value="2">Japanese</option>
</select>
細かく調べていなかったが、どちらの場合も、selected が入っているので動作するものかと思っていた。
そこで、HTML の仕様を調べてみた。
The SELECT, OPTGROUP, and OPTION elements を見ると selected
は select
に掛かることはなく、option
にのみ掛かる引数だと分かる。つまり、ActionPack が正しい HTML を生成していないのが、不具合の原因だ。
ActionPack の select
関数は :selected
が指定されていると、正しい HTML を生成できない。
ActionPack 内の lib/action_view/helpers/form_options_helper.rb を見てみた。随分長い、if 文が並んでいて、何が起きているのか簡単には分からず、直せなかった。今回は一度変更した値は変えられない様にして、対処することにする。時間が取れる時に修正するか、報告したい。
コメント
_ Shouta ― 2007年01月25日 13時59分43秒
_ uyota ― 2007年01月31日 12時54分35秒
確かに、 {:selected => 2} で Japanese が選ばれる様になりました。
書く前と書いている間も {:selected => 2} と {:selected => "2"} を試して、動作しなかったのを確認したはずだったのですが、途中で混乱でもしていたのでしょうか。
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/01/09/1102545/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
Language.find(:all).map {|l| [ l.name, l.id ]},
{:selected => 2},
{}
%>
では?(2つ目のハッシュはselectタグのattributeに全てダイレクトに反映されるんだったかと。)