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?
的缩写。也就是说,添加?
可以方便地查看属性中当前是否存在任何内容
问题是,问号不应该是属性名称的一部分。还有几个原因:
不合法(双问号在Ruby中不起作用)def???
- 符号不能以
结尾?
- 变量不能以
结尾?
- 实例变量不能以
?
- 方法名称中的
必须是最后一个字符。所以?
不是有效的setter方法?=
所有这些归结为:您应该使数据库列名遵循与Ruby方法名相同的规则,因为ActiveRecord使它们在同一个目录中成为一个列名。也就是说,每个列名都成为一个具有getter和setter的属性。基于以问号结尾的属性,既不能正确定义getter、setter,也不能正确定义内部实例变量。因此,您必须将列名更改回仅
active
(无问号)。您只想检查复选框是否处于活动状态?否,我想更新数据库中的active?
列。尝试将属性重命名为t.booleanactive
而不是active?
知道在哪里记录了这一点吗,关于自动响应布尔值的?
,该概念称为“属性查询方法”。有一点文档记录。或者,您可以查看源代码。