私は現在、ネストされたフォームとさらに別のデータテーブルの値を使用してコレクションを選択することで、1:n の関係を持つ複雑な Rails フォームを作成しています。
これまでのところ、更新前にユーザーが正しい値を選択しないと、collection_select の値リストの最初のエントリでデータベースの値が上書きされます。collection_select の初期値を正しく設定する必要があります。
私はすでに SO に関する多くの質問を読みましたが、最も関連性の高いものは次のとおりでした: f-collection-select-not-displaying-the-selected-value
まだ欠けている唯一のもの(私は願っています!)は、データベースからのフォームフィールドの値の設定です。そのため、ユーザーが選択に触れていなくても、選択可能な値からのデフォルト値で上書きされません.
このスニペットは、私のコードと上記の質問に対する解決策から派生したものであり、間違っています。
人に多くのものを持たせ、validthings には可能な値が含まれています。
モノの表には、有効なモノの表にもあるモノの文字列のみが存在します。collection_select の選択されたパラメーターに、有効なテーブルの値のリストで識別できる、things テーブルの文字列を指定することができます。
<div class="col-md-12">
<%= form_for(@person) do |f| %>
<%= f.fields_for :things do |d| %>
<%= d.hidden_field :id %><%= d.hidden_field :person_id %>
<%= d.collection_select(:Thing, Validthings.all, :Thing, :Thing, {:selected => @person.things.map(&:id).Thing.to_s} ) %>
<% end %>
<% end %>
</div>
これは間違っていることです:
@person.things.map(&:id).Thing.to_s
はい、表の person and things と validthings では、列の名前は "Thing" です。これはテーブルvalidthingsの一意の文字列です-データベース構造は私の考えではありませんでした.私はそれを扱うだけです.