Rails check_box从名称中删除问号

时间:2014-07-15 10:06:27

标签: ruby-on-rails ruby-on-rails-4

我有一个包含列定义projects的表t.boolean "active?"

在我关联的_form.html.erb文件中:

  <tr>
    <td><%= f.label :active? %></td>
    <td><%= f.check_box(:active?) %></td>
  </tr>

这是生成HTML:

<tr>
    <td><label for="project_active">Active?</label></td>
    <td><input name="project[active]" type="hidden" value="0" /><input id="project_active" name="project[active]" type="checkbox" value="1" /></td>
</tr>

所以传回的参数是active(没有问号),而不是active?,它会被强参数检查立即拒绝(并且不会匹配数据库中的任何内容)如果它通过了)

我做错了什么?该列最初称为active(无问号),我已通过迁移对其进行了更改,但我无法找到旧版本的任何遗留引用。

1 个答案:

答案 0 :(得分:1)

问号(?)在Ruby,Rails和ActiveRecord中具有特定含义。

布尔属性响应<attribute_name>?以及只有<attribute_name>的true / false作为语义清晰度的问题。也就是说,?表明该属性是一个布尔值,并返回true或false。

其他属性类型(由数据库表中的列支持)将响应<attribute_name>?,作为<attribute_name>.present?的简写。也就是说,附加?行为可以方便地查看当前是否存在属性中的任何内容。

关键是问号不应该是属性名称的一部分。还有一些原因:

  • def <atribute_name>??不合法(双重问号在Ruby中不起作用)
  • 符号不能以?
  • 结尾
  • 变量不能以?
  • 结尾
  • 实例变量不能以?
  • 结尾 方法名称中的
  • ?必须是最后一个字符。因此<my_attribute>?=不是有效的setter方法。

所有这些归结为:您应该使您的数据库列名遵循与Ruby方法名称相同的规则,因为ActiveRecord使它们成为同一个。也就是说,每个列名称都成为具有getter和setter的属性。并且getter,setter和内部实例变量都不能基于以问号结尾的属性来正确定义。因此,您必须将列名更改回active(没有问号)。