Ruby on rails Rails复选框从名称中删除问号

Ruby on rails Rails复选框从名称中删除问号,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有一个表projects包含一个列定义t.boolean“active?” 在相关的\u form.html.erb文件中,我有: <tr> <td><%= f.label :active? %></td> <td><%= f.check_box(:active?) %></td> </tr> 这将生成HTML: <tr> <td><

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

在相关的
\u 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
(无问号),我对其进行了迁移,但我找不到任何对旧版本的长期引用。

问号(
)在Ruby、Rails和ActiveRecord中有特定的含义

布尔属性对
以及
作出响应,在语义上明确表示为真/假。也就是说,
很明显,该属性是一个布尔值,将返回true或false

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

问题是,问号不应该是属性名称的一部分。还有几个原因:

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

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

您只想检查复选框是否处于活动状态?否,我想更新数据库中的
active?
列。尝试将属性重命名为t.boolean
active
而不是
active?
知道在哪里记录了这一点吗,关于自动响应布尔值的
,该概念称为“属性查询方法”。有一点文档记录。或者,您可以查看源代码。