如何让 select_tag 带有 "selected disabled hidden" 选项?

How to have a select_tag with an "selected disabled hidden" option?

我想要一个 select_tag,其中包含一个向用户显示 "Please select" 的字段。 用户不得select启用此字段。

这是我想要的 jsfiddle:http://jsfiddle.net/gleezer/pm7cefvg/1/

在 Rails 中,我尝试这样做:

  <%= select_tag(:userchief, options_for_select(@options_for_selectUsers, {:selected => "x1", :disabled => "x1", :hidden => "x1"})) %>

@options_for_user是一个包含多个key/value元素的数组) 但是当我检查我的页面的源代码时,我可以看到这个作为我的选择:

<option disabled="disabled" selected="selected" value="x1">Select</option>

这不是我想要的,x1 select 选项出现在 select 的下拉菜单中,因为隐藏字段不存在。

我怎样才能获得与我在 jsfiddle 中看到的相同的结果 link?

如果您希望占位符仅在呈现表单时属性为 nil 时显示,请使用 :prompt => "Placeholder"。默认情况下它将被 selected,但如果用户提交,则不会保存任何内容。如果该属性已经填充[可能是因为 a) 有默认值或 b) 它是一个编辑表单],占位符项目将从列表中完全省略。

select_tag "people", options_from_collection_for_select(@people, "id", "name"), prompt: "Select something"
# => <select id="people" name="people"><option value="">Select something</option><option value="1">David</option></select>

如果您想始终在渲染列表中包含占位符,请使用:include_blank =>“占位符”。

更新

以下代码将在更改后禁用提示。这与您的示例非常相似。

<%=  select_tag(name = 'person', options_for_select(User.all.unshift("your prompt message"), selected: prompt, disabled: prompt,) ) %>

如果您想删除 select 更改的提示,则需要使用 jquery。

$("#selectBox").change(function(){
   $("#selectBox option[value='']").remove();
}​);

这是旧的,但刚刚找到了一个不用 js 的好方法。可以肯定的是,这是基于公认的答案,所以归功于作者。基本上将 display:none 添加到所选选项会将其从选项列表中隐藏,但最初仍会显示在下拉列表中。

CSS:

.hidden {
  display: none
}

HTML:

<%= f.select :category, options_for_select([['New', 0, {class: 'hidden'}], ['Improved', 1], ['Fixed', 2]], selected: 0, disabled: 0) %>