web-dev-qa-db-ja.com

f.selectフォームフィールドに空白の値を設定する方法

ユーザーが自分のプロファイルで性別を選択できるようにするために、以下を使用しています。

<%= f.select (:sex, %w{ Male Female }) %>

User.sex列に何も渡されなかった場合にリストがデフォルトとする空白値を作成するにはどうすればよいですか?単に男性または女性を文字列として渡します。

目的は、検証で選択する必要があることを確認できるように、空の値が必要なことです。

57
bgadoci

目的に応じて、2つの可能性があります。

include_blank

<%= f.select (:sex, %w{ Male Female }, :include_blank => true) %>

これには、常にselectに空白のオプションが含まれます。これにより、編集フォームでこの値が表示されている場合、値を空白の値に戻すことができます。

Prompt

<%= f.select (:sex, %w{ Male Female }, :Prompt => "Gender...") %>

これには、フィールドがまだ設定されていない限り、指定されたプロンプト値が含まれます。持っている場合(たとえば、編集フォーム上)、プロンプトを表示しないように値を選択する必要があることをユーザーに思い出させる必要はありません。

122
Gareth

次のようなことができると思います。

<%= f.select (:sex, %w{ Male Female }, {:include_blank => 'None Specified'} ) %>
33
jyoseph

in Rails 4では、次のようなプロンプトを実現できます。

<%= f.select :gender, %w{ Male Female }, {:Prompt => "Gender..."} %>

シンプルな形で私のために働いています。

3
Ziv Galili

文字列として「プロンプト」を使用しようとしました。しかし、レンダリングされた出力では、新しいオプションのプロンプトは表示されませんでした。 select_tagメソッドは、シンボルのみを検索します。 :include_blankにも当てはまるようです。 options.deleteをチェックアウトします。

  def select_tag(name, option_tags = nil, options = {})
    option_tags ||= ""
    html_name = (options[:multiple] == true && !name.to_s.ends_with?("[]")) ? "#{name}[]" : name

    if options.include?(:include_blank)
      include_blank = options.delete(:include_blank)

      if include_blank == true
        include_blank = ''
      end

      if include_blank
        option_tags = content_tag(:option, include_blank, value: '').safe_concat(option_tags)
      end
    end

    if Prompt = options.delete(:Prompt)
      option_tags = content_tag(:option, Prompt, value: '').safe_concat(option_tags)
    end

    content_tag :select, option_tags, { "name" => html_name, "id" => sanitize_to_id(name) }.update(options.stringify_keys)
  end

:include_blankと:Promptは、options_for_selectではなく、selectまたはselect_tagのオプションになることに注意してください。

0
Donato

あなたは一緒に行きます

<%= f.select :gender, %w{ Male Female }, :include_blank => true %>
0
Hardik Hardiya