ruby on rails-如何为f.select表单字段设置空白值

我使用以下内容允许用户在个人资料中选择自己的性别。

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

如果未将任何内容传递给user.sex列,我将如何创建列表默认的空白值? 我只是通过男性或女性作为字符串。

目的是我想要一个空白值,以便验证可以确保他们知道必须选择它。

bgadoci asked 2019-11-06T23:43:25Z
5个解决方案
124 votes

有两种可能,具体取决于您要做什么:

prompt

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

这将始终在选择中包含一个空白选项,如果人们在编辑表单上看到此值,则可以将其设置回空白值。

prompt

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

只要尚未设置该字段,它将包括指定的提示值。 如果有(例如,在编辑表单上),则无需提醒用户他们需要选择一个值,因此不会出现提示

Gareth answered 2019-11-06T23:44:03Z
34 votes

我认为您可以执行以下操作:

<%= f.select (:sex, %w{ Male Female }, {:include_blank => 'None Specified'} ) %>
jyoseph answered 2019-11-06T23:44:27Z
3 votes

在Rails 4中,您可以实现如下提示:

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

它以简单的形式为我工作。

Ziv Galili answered 2019-11-06T23:44:57Z
0 votes

你去

<%= f.select :gender, %w{ Male Female }, :include_blank => true %>
Hardik Hardiya answered 2019-11-06T23:45:20Z
0 votes

我尝试将“提示”用作字符串。 但是在渲染的输出中,没有出现新的选项提示。 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将是select或select_tag的选项,而不是options_for_select。

Donato answered 2019-11-06T23:45:51Z
translate from https://stackoverflow.com:/questions/4444523/how-do-i-set-a-blank-value-for-an-f-select-form-field