web-dev-qa-db-fra.com

Comment définir une valeur vide pour un champ de formulaire f.select

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. 

51
bgadoci

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.

117
Gareth

Je pense que vous pouvez faire quelque chose comme ça:

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

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.

3
Ziv Galili

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.

0
Donato

Tu vas avec

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