J'utilise les éléments suivants pour permettre à mes utilisateurs de sélectionner leur sexe dans leur profil.
<%= f.select (:sex, %w{ Male Female }) %>
Comment créer une valeur vide à laquelle la liste serait associée par défaut si rien n'a été transmis à la colonne user.sex? Je ne fais que passer un homme ou une femme comme une ficelle.
Le but est que je souhaite une valeur vide afin qu’une validation puisse s’assurer qu’ils sont conscients qu’ils doivent la sélectionner.
Il y a deux possibilités, selon ce que vous recherchez:
include_blank
<%= f.select (:sex, %w{ Male Female }, :include_blank => true) %>
Cela inclura toujours une option vide dans la sélection, ce qui permettra aux utilisateurs de redéfinir la valeur sur la valeur vide s'ils le voient sur un formulaire de modification.
Prompt
<%= f.select (:sex, %w{ Male Female }, :Prompt => "Gender...") %>
Cela inclura la valeur d'invite spécifiée, tant que le champ n'a pas déjà été défini. Si tel est le cas (sur un formulaire de modification par exemple), il n'est pas nécessaire de rappeler à l'utilisateur qu'il doit sélectionner une valeur pour que l'invite n'apparaisse pas.
Je pense que vous pouvez faire quelque chose comme ça:
<%= f.select (:sex, %w{ Male Female }, {:include_blank => 'None Specified'} ) %>
dans Rails 4, vous pouvez obtenir une invite comme ceci:
<%= f.select :gender, %w{ Male Female }, {:Prompt => "Gender..."} %>
ça marche pour moi avec une forme simple.
J'ai essayé d'utiliser 'Prompt' comme chaîne. Mais dans la sortie rendue, la nouvelle option Invite n'apparaissait pas. La méthode select_tag recherche uniquement un symbole. Cela semble être le cas pour: include_blank également. Découvrez les 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
Notez également que: include_blank et: Invite seront les options de select ou de select_tag, et non les options_for_select.
Tu vas avec
<%= f.select :gender, %w{ Male Female }, :include_blank => true %>