回答:
これはそれを行うはずです:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
より良い方法です。どんな状況でも、フォーム編集にも適しています。
現在のインスタンスの正しい属性を使用します(例:) @work.project_id
:
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
も動作するため、これが最良の答えです。おかげで本当に助かりました。
options_for_select(..., f.object.project_id )
これらすべての回答の問題は、レコードを編集しようとしても、フィールドがデフォルト値に設定されることです。
デフォルトを既存の値に設定し、値がない場合にのみ実際のデフォルトに設定する必要があります。そのようです:
f.select :field, options_for_select(value_array, f.object.field || default_value)
慣れていない人はf.object.field
常に使用f.object
し、その最後にフィールド名を追加してください。
select2
JSプラグインでも機能します。同じフォームでレコードを作成または編集し、select2を使用する場合、特にプレースホルダーテキストを使用する場合は、完全に機能します。
これを試して:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
しませんでしたが、例では機能しました。
params [:pid]が文字列の場合、それがフォームからのものである場合は、それを使用する必要があります。
params[:pid].to_i
選択リストで正しい項目を選択するため
@project
の背面に付加データベーステーブルから、代わりにタイトルのIDを持つ変数を、このコードが働いたform.select
ヘルパー:selected: @project
あなたは@danengleありがとう
私は仕事にこれを取得し、私が正しいのではないだけで、「選択」HTML属性を追加するために必要なことがわかったことができませんでした<option>
タグが、またに<select>
タグ。selectタグのselected属性に関するMDNのドキュメントは次のように述べています:
selected-ブール属性は、特定のオプションを最初に選択できることを示します。
つまり、コードは次のようになります。
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
または、f.selectの最初の引数がその特定の属性をプルするため、コントローラーに:project_id属性を設定することもできます。
fオブジェクトを印刷しようとすると、選択したアイテムを取得するためにプローブできるf.objectがあることがわかります(すべてのレールバージョン> 2.3に適用可能)
logger.warn("f #{f.object.inspect}")
そのため、次のスクリプトを使用して、適切に選択されたオプションを取得します。
:selected => f.object.your_field
そのすでに説明した、例を挙げよう
選択リストを
select_list = { eligible: 1, ineligible: 0 }
したがって、次のコードは
<%= f.select :to_vote, select_list %>
<select name="to_vote" id="to_vote">
<option value="1">eligible</option>
<option value="0">ineligible</option>
</select>
したがって、デフォルトで選択されたオプションを作成するには、selected:valueを使用する必要があります。
<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>
もしcan_vote?trueを返し、選択を設定します:1場合、最初の値が選択され、それ以外の場合は2番目に選択されます。
select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
<option value="1">eligible</option>
<option selected="selected" value="0">ineligible</option>
</select>
選択オプションが速攻ではなく単なる配列リストの場合、選択されたものは選択される値になります。
select_list = [ 'eligible', 'ineligible' ]
今、選択されただけがかかります
<%= f.select :to_vote, select_list, selected: 'ineligible' %>
上記のMike Bethanyの答えは、新しいレコードが作成されているときにデフォルト値を設定し、ユーザーが選択した値を編集フォームに表示するように働きました。しかし、モデル検証を追加したため、フォームを送信できませんでした。これは、フィールドでモデル検証を行い、デフォルト値と編集モードでユーザーが選択した値を表示するために私が機能したものです。
<div class="field">
<%= f.label :project_id, 'my project id', class: "control-label" %><br>
<% if @work.new_record? %>
<%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
<% else %>
<%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
<% end %>
</div>
モデルの検証
validates :project_id, presence: true
これでうまくいくはずです。{:value => params[:pid] }
html_options変数に渡されるだけです。
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>