ユーザーが自分のプロファイルで性別を選択できるようにするために、以下を使用しています。
<%= f.select (:sex, %w{ Male Female }) %>
User.sex列に何も渡されなかった場合にリストがデフォルトとする空白値を作成するにはどうすればよいですか?単に男性または女性を文字列として渡します。
目的は、検証で選択する必要があることを確認できるように、空の値が必要なことです。
目的に応じて、2つの可能性があります。
include_blank
<%= f.select (:sex, %w{ Male Female }, :include_blank => true) %>
これには、常にselectに空白のオプションが含まれます。これにより、編集フォームでこの値が表示されている場合、値を空白の値に戻すことができます。
Prompt
<%= f.select (:sex, %w{ Male Female }, :Prompt => "Gender...") %>
これには、フィールドがまだ設定されていない限り、指定されたプロンプト値が含まれます。持っている場合(たとえば、編集フォーム上)、プロンプトを表示しないように値を選択する必要があることをユーザーに思い出させる必要はありません。
次のようなことができると思います。
<%= f.select (:sex, %w{ Male Female }, {:include_blank => 'None Specified'} ) %>
in Rails 4では、次のようなプロンプトを実現できます。
<%= f.select :gender, %w{ Male Female }, {:Prompt => "Gender..."} %>
シンプルな形で私のために働いています。
文字列として「プロンプト」を使用しようとしました。しかし、レンダリングされた出力では、新しいオプションのプロンプトは表示されませんでした。 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のオプションになることに注意してください。
あなたは一緒に行きます
<%= f.select :gender, %w{ Male Female }, :include_blank => true %>