我有一个包含列定义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
(无问号),我已通过迁移对其进行了更改,但我无法找到旧版本的任何遗留引用。
答案 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
(没有问号)。