上図のようなmodelの構造で、DouroFusetsuの更新画面を考えてみる。
まずはscaffold。(実行結果は省略。)
rails generate scaffold douro_fusetsu shichoson:references douro:referencesデフォルトの状態の画面では、下図のように型をreferencesにして作成したmodelクラスのハッシュを入力しなければならないので、
コンボボックスでIDを選択できるように、下図のように変更する。
View側のソースは下記のようになる。
<%= form_for(@douro_fusetsu) do |f| %> <% if @douro_fusetsu.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@douro_fusetsu.errors.count, "error") %> prohibited this douro_fusetsu from being saved:</h2> <ul> <% @douro_fusetsu.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label :shichoson %><br /> <%= f.collection_select(:shichoson_id, Shichoson.find(:all), :id, :name) %> </div> <div class="field"> <%= f.label :douro %><br /> <%= f.collection_select(:douro_id, Douro.find(:all), :id, :name) %> </div> <div class="actions"> <%= f.submit %> </div> <% end %>市町村では、選択肢の数が多すぎる(日本全国で1742もある)ので、都道府県を選択して数を絞り込めるようにしたい。
TodofukenとShichosonは親子関係であるものの、DouroFusetsuはTodofukenと直接関係がないので、f.collection_selectは使うことができない。
その代わりに、下記のように、f.をつけずにcollection_selectを使うことにする。
<%= collection_select(:douro_fusetsu, "todofuken_id", Todofuken.find(:all), :id, :name) %>しかしながらエラーが表示されてしまう。
f.がついていなくても、formの名前が同じ場合は、form_forで関連づけられているmodelのメンバーではないということでエラーになってしまうようだ。
下記のように、シンボル:douro_fusetsu ではなく、まったく別の名前を指定すると、
<%= collection_select("help", "todofuken_id", Todofuken.find(:all), :id, :name) %>エラーが出ずに表示されるようになった。
0 件のコメント:
コメントを投稿