如何为f.select表单字段设置空白值

时间:2010-12-14 21:40:38

标签: ruby-on-rails ruby select

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

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

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

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

5 个答案:

答案 0 :(得分:119)

根据您的目标,有两种可能性:

include_blank

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

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

prompt

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

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

答案 1 :(得分:32)

我认为你可以这样做:

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

答案 2 :(得分:3)

在Rails 4中你可以实现这样的提示:

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

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

答案 3 :(得分:0)

你选择

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

答案 4 :(得分:0)

我试图使用'prompt'作为字符串。但是在渲染的输出中,没有出现新的选项提示。 select_tag方法仅搜索符号。 :include_blank也是如此。查看选项。删除:

  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。