TodoList: ActionPack にバグあり2007年01月09日 12時08分03秒

Todo を多言語化の最中だが、ActionPack のバグを見つけたようだ。現在入っているバージョンは 1.23.5 である。

以前に、所属組織 (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 を見ると selectedselect に掛かることはなく、optionにのみ掛かる引数だと分かる。つまり、ActionPack が正しい HTML を生成していないのが、不具合の原因だ。

ActionPack の select 関数は :selected が指定されていると、正しい HTML を生成できない。

ActionPack 内の lib/action_view/helpers/form_options_helper.rb を見てみた。随分長い、if 文が並んでいて、何が起きているのか簡単には分からず、直せなかった。今回は一度変更した値は変えられない様にして、対処することにする。時間が取れる時に修正するか、報告したい。

前回次回