背景: 私の目標は、StateDescription の STI サブクラスである「状態」の has_many オブジェクトのリストをビューに表示することです。ユーザーがドロップダウンメニューから状態の説明のタイプを選択できるようにしたい(最終的には、条件付きで別のタイプのフォームを表示する)
メインフォーム内で、次のようなネストされたフォームを実行しています。
<%= f.fields_for :conditions do |e| %>
<li>
<%= e.select(:type, StateDescription.subclasses.collect{|x| x.to_s}, options_for_select(StateDescription.subclassSelectForms)) %>
<br>
<%= e.label :title %>
<%= e.text_field :title %>
</li>
<% end %>
これは、下部のテキスト フィールドで問題なく機能します (値を変更して保存することもできます)。しかし、select ステートメントを実行しようとすると、爆発します。
具体的には、 e.select を使用せずに次のことを行う場合:
<%= select(:type, StateDescription.subclasses.collect{|x| x.to_s}, options_for_select(StateDescription.subclassSelectForms)) %>
問題なくレンダリングされますが、モデルに関連付けられていないため、実際には値を変更しません。
送信した値とは異なる値を表示させようとするのをやめて、
<%= e.select(:type, StateDescription.subclasses.collect{|x| x.to_s}) %>
その後、問題なく動作します(送信でき、値がデータベースに保存され、取得できますなど)。
このままでも構いませんが、Rails クラスのものではなく、より人間が読みやすい文字列を表示したいと考えていました (これは、プログラマー以外のエンド ユーザーには意味不明に見えるかもしれません)。
だから、私の質問は:なぜ options_for_select はネストされてフォームに関連付けられているときに壊れるのですか? 単なる既知のバグですか?私は何か間違ったことをしていますか?
編集:
.subclasses は、オブジェクトのサブクラスのリストを返す標準の Rails 呼び出しです。
.subclassSelect フォームは各サブクラスを通過し、フォームのハッシュに変換します。
{subclass.to_s => subclass.human_readable_string} に変換し、それらすべてを配列にコンパイルします。
このハッシュの配列が機能することはわかっています。前に「e」を付けないと、正しく表示され、実行したことに対して「正しく」機能するためです(つまり、選択した人間が読み取れる文字列に基づいてサブクラスが正しく返されます)ドロップダウン メニューに表示されますが、実際にはどのフォームにも関連付けられていないため、コントローラーには設定されません)。