RoR – 选择包含include_blank disable的标记

我想要一个这样的结果:

 Choose a car Volvo Saab Mercedes Audi  

使用以下代码,我最终只能得到:

  'Choose a car', :disabled => 'Choose a car'}) %> 

=>

  Choose a car Volvo Saab Mercedes Audi  

第一个选项未被禁用…

我相信你要找的是如下:

 <%= f.select(:car, xxxxxx, {:include_blank => 'Choose a car', :disabled => 1}) %> 

Ito A的答案在Rails 4.2中不起作用(不确定早期版本)。 从文档 ……

:disabled – 可以是单个值或将在最终输出中禁用选项的值数组。

因此, :disabled选项应该被赋予一个值,该值与集合中某个选项的值相匹配。 所以, :disabled => 'volvo'将禁用value='volvo'的选项。 但是,它与include_blank选项不匹配,因为该选项不是传递给select方法的集合的一部分。

Rails select helper不直接支持所需的行为。 但是,您可以通过向集合添加空白选项来解决此问题,如下所示。

创建集合,然后为其添加一个空白选项。

 car_names = %w(volvo saab mercedes audi) car_names_with_blank = car_names.map{|c| [c, c]}.prepend(['Choose a car', nil]) 

在视图中:

 <%= f.select(:name, car_names_with_blank, {disabled: '', selected: ''}) %> 

这是一个带有工作示例的Github存储库的链接 。 该例子还表明,Ito A的回答以及类似SO问题的其他答案都不起作用。

更新:我已经用解决方案和其他信息更新了我的答案。

以下解决方案的应用如下。

创建应用程序帮助程序function

 def build_selections(prompt: "Select One", selections: {}) selections.reverse!.push([prompt, nil]).reverse! end 

然后在你的视图中使用它:

 <%= f.select :category_id, build_selections(prompt: 'Select Category', selections: @category.collect{|x| [x.name, x.id]}), disabled: '' %>