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

前回次回

コメント

_ Shouta ― 2007年01月25日 13時59分43秒

<%= select :description, :language_id,
Language.find(:all).map {|l| [ l.name, l.id ]},
{:selected => 2},
{}
%>

では?(2つ目のハッシュはselectタグのattributeに全てダイレクトに反映されるんだったかと。)

_ uyota ― 2007年01月31日 12時54分35秒

遅くなりましたが、試してみました。

確かに、 {:selected => 2} で Japanese が選ばれる様になりました。

書く前と書いている間も {:selected => 2} と {:selected => "2"} を試して、動作しなかったのを確認したはずだったのですが、途中で混乱でもしていたのでしょうか。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2007/01/09/1102545/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。