Rails選択ヘルパー-デフォルトの選択値、どうやって?


182

これが私が現在使用しているコードの一部です:

<%= f.select :project_id, @project_select %>

デフォルト値をparams[:pid]ページが読み込まれたときと同じになるように変更するにはどうすればよいですか?


:project_idが設定されていない場合、またはページのロード時にデフォルトのプロジェクトを選択するのか、paramsハッシュの選択の値を:pidとして返すのかはわかりません。
Tilendor 2009年

回答:


223

これはそれを行うはずです:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>

5
パラメータなしで、 options_for_selectより良い方法です。どんな状況でも、フォーム編集にも適しています。
アドリアーノResende 2015年

ここで重要なのは、次のとおりです。f.select対あなたの関数を見てください(options_for_select()これらは異なる機能していることを忘れないでください。。
FlyingV

126

現在のインスタンスの正しい属性を使用します(例:) @work.project_id

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
これselect_tagも動作するため、これが最良の答えです。おかげで本当に助かりました。
stephenmurdoch 2014年

7
また、試してみることができますoptions_for_select(..., f.object.project_id )
8

本当にありがとう!他のすべての受け入れられた答えは、変数を介して選択する方法を述べていません。
Mike Belanger、2018年

52

Rails 3.0.9

select options_for_select([value1, value2, value3], default)

デフォルト値を区切るカンマのの値配列の前後の閉じ括弧に気付くまで、この解決策を理解することができませんでした...この括弧を逃しましたvalue3], default
BigRon

33

これらすべての回答の問題は、レコードを編集しようとしても、フィールドがデフォルト値に設定されることです。

デフォルトを既存の値に設定し、値がない場合にのみ実際のデフォルトに設定する必要があります。そのようです:

f.select :field, options_for_select(value_array, f.object.field || default_value)

慣れていない人はf.object.field常に使用f.objectし、その最後にフィールド名を追加してください。


3
これはクリーンなソリューションであり、前述のように、デフォルト値は新規にのみ設定し、現在の値は編集時に設定します。
count0

1
私はこれが古いスレッドであることを知っていますが、それに遭遇する可能性のあるすべての人にとって、この回答はselect2JSプラグインでも機能します。同じフォームでレコードを作成または編集し、select2を使用する場合、特にプレースホルダーテキストを使用する場合は、完全に機能します。
cdouble.bhuck 2017

@Mike Bethanyが他のすべての回答はフォームが新しいレコードに対してのみレンダリングされると仮定しているように、これは回答として受け入れられるものであると思います。クドスマイク
エリックカストリージョ

22

これを試して:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

Rails 4を使用すると、は機能params[:pid]しませんでしたが、例では機能しました。
Eric Wanchic 2013

これは、「f.fields_for」の内部で部分的な部分を使用しているため、うまくいきました。
Hugo

11

params [:pid]が文字列の場合、それがフォームからのものである場合は、それを使用する必要があります。

params[:pid].to_i  

選択リストで正しい項目を選択するため


この回答は、私の問題を特定するのに役立ちました。私の選択ボックスは動的で、データベースからコレクションを取得しています。アイテムのIDではなく、タイトルでデフォルトの選択を入力しようとしました。この答えは、私はその問題を参照してください助けた、と私は私の人口一度@projectの背面に付加データベーステーブルから、代わりにタイトルのIDを持つ変数を、このコードが働いたform.selectヘルパー:selected: @projectあなたは@danengleありがとう
クリストファー・ウォリントン

10

私は解決策を見つけました、そして私はRoRでかなり未経験であることがわかりました。

上記のビューを管理するコントローラーの内部に以下を追加します。

@work.project_id = params[:pid] unless params[:pid].nil?

7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

3

私は仕事にこれを取得し、私が正しいのではないだけで、「選択」HTML属性を追加するために必要なことがわかったことができませんでした<option>タグが、また<select>タグ。selectタグのselected属性に関するMDNのドキュメントは次のように述べています:

selected-ブール属性は、特定のオプションを最初に選択できることを示します。

つまり、コードは次のようになります。

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}


0

または、f.selectの最初の引数がその特定の属性をプルするため、コントローラーに:project_id属性を設定することもできます。


0

fオブジェクトを印刷しようとすると、選択したアイテムを取得するためにプローブできるf.objectがあることがわかります(すべてのレールバージョン> 2.3に適用可能)

logger.warn("f #{f.object.inspect}")

そのため、次のスクリプトを使用して、適切に選択されたオプションを取得します。

:selected => f.object.your_field 

0

そのすでに説明した、例を挙げよう

選択リストを

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' %>

0

上記の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

-2

これでうまくいくはずです。{:value => params[:pid] }html_options変数に渡されるだけです。

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

ただし、select:S
totocaster 2009年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.