Ruby On Rails:配置f.input辅助方法以将“请选择”作为提示

时间:2015-07-24 13:16:10

标签: ruby-on-rails ruby forms

我的Ruby on Rails项目中有一个表单。这与我的模型有关。 我有一个boolean值,可以truefalse。 我没有使用复选框来设置它,而是将其更改为选择框。

<%= f.input :test_account, :as => :select, :prompt => true, :include_blank => true %>

我在这里添加了:prompt:include_blank(可能我只需要其中一个)。目前,select默认为“No”值。这不是我想要的,我希望它坚持“请选择...”以验证用户做出选择而不是仅仅跳过整个问题。

在我的模型中,我现在有以下内容来验证它: validates_inclusion_of :test_account, :in => [true, false]

如何将其配置为“请选择”,“否”,“是”作为其值,并在提交表单但未选择任何值时报告错误。

4 个答案:

答案 0 :(得分:1)

您还可以使用select方法生成Select下拉列表,如

示例:

select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {include_blank: 'None'})

可能会成为:

<select name="post[person_id]">
  <option value="">None</option>
  <option value="1">David</option>
  <option value="2" selected="selected">Sam</option>
  <option value="3">Tobias</option>
</select>

在你的情况下

f.select("test_account", ['true', 'false'], {include_blank: 'Please select...'})
  

注意:
  当没有当前值时,:prompt会出现在列表中   :include_blank始终显示在列表中。

答案 1 :(得分:0)

<%= f.input :test_account, :as => :select, :prompt => "Please select"%>

尝试

<%= f.input :test_account, collection: [true,false], prompt: "Please select"%>

答案 2 :(得分:0)

使用此代码:

<%= f.input :test_account, :as => :select, :prompt => "Please select"%>

答案 3 :(得分:0)

3个状态无法用布尔值表示。

我不知道这是否是答案,但你的问题很有趣。我认为这是一个数据问题,而不是形式问题。如果我了解您的情况,您有3个可测试的变量状态:

  • 没有
  • 没有选择

这似乎在逻辑上排除了使用布尔值。错误状态,零状态和未选择的状态都是&#34; false&#34;,因此您在该状态下发生碰撞。当您处于表单中时,您根本不知道var是否未被选中,或者被选为false(除非您执行一些js侦听器操作以查看是否有某些内容被点击)。

在我看来,解决方案是使用字符串来表示&#34;是&#34;和&#34;不&#34;和nil作为第三个,没有任何选择的选项。

然后,当您使用模型验证变量的存在时,表单验证按设计工作。

<强>纠错/澄清

在Ruby on Rails中,3状态可以用布尔值

表示

如果有人遇到这个讨论,我想我会在与SO用户@D-side讨论之后发布更正。

对于以前的小工作者来说,这似乎不符合逻辑,我自己就在其中,但似乎我们认为Ruby of Rails中的布尔值并不是严格类型为布尔,实际上有三种状态。即使在数据库中,布尔类型也可能有3种状态。

来自PostgreSQL文档:

  

布尔类型可以有几种状态:&#34; true&#34;,&#34; false&#34;和第三种状态,&#34; unknown&#34;,由SQL null表示值。

在与@D-side的讨论中,下面是我所谓的三布尔的优秀Ruby解释。