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 文が並んでいて、何が起きているのか簡単には分からず、直せなかった。今回は一度変更した値は変えられない様にして、対処することにする。時間が取れる時に修正するか、報告したい。
最近のコメント