Rails 4 - 复选框和布尔字段

12

我在网上看过很多不同的文章(其中一些在这里),涉及到这个问题,但是有很多不同的建议,其中许多已经过时,这促使我今天在这里提问...

在我的用户表中有一个名为"admin?"的字段,它是一个:boolean数据类型。我在我的视图表单中也有一个名为"admin?"的复选框 - 当表单提交时,我想能够相应地在表格记录中创建TRUE和FALSE。

我的视图代码的一部分如下:

Admin User&#63; <%= f.check_box :admin? %>

同时我已经在我的post_params中允许了这一点,这是必要的步骤吗?

params.require(:staff).permit(:name, :email, :password, :password_confirmation, :admin?)

当我此刻提交表单时,管理员字段不受影响。如有建议,将不胜感激。

3个回答

21

不需要将它命名为“:admin?”

只需在您的表单中使用此代码:

Admin User&#63; <%= f.check_box :admin %>

而允许的参数就像这样:

params.require(:staff).permit(:name, :email, :password, :password_confirmation, :admin)

那应该可以。


当我使用 f.checkbox :admin 时,它会抛出一个错误,但是当我使用 admin? 时却没有。 - tommyd456
在表格中,该字段应该叫做admin还是admin?(带问号)我看到有地方建议在布尔字段中使用问号。 - tommyd456
1
实际上我撤回了之前的说法。经过更多的研究,我应该将其命名为admin而不是?https://dev59.com/RnI_5IYBdhLWcg3wF_J3 - tommyd456

7

对于任何没有包含在对象中的表单。

我发现使用复选框语法,例如:

= check_box 'do_this', '', {}, 'true', 'false'

然后在控制器端:

ActiveRecord::ConnectionAdapters::Column.value_to_boolean(params[:do_this])

将为您提供 do_this 的正确布尔值。

示例:

[1] pry(main)> ActiveRecord::ConnectionAdapters::Column.value_to_boolean("true")
=> true
[2] pry(main)> ActiveRecord::ConnectionAdapters::Column.value_to_boolean("false")
=> false
[3] pry(main)> ActiveRecord::ConnectionAdapters::Column.value_to_boolean("1")
=> true
[4] pry(main)> ActiveRecord::ConnectionAdapters::Column.value_to_boolean("0")
=> false

编辑: 以上内容已过时,请使用:

ActiveRecord::Type::Boolean.new.type_cast_from_database(value)

它会产生与上面的示例相同的结果。

Rails 5: 在Rails 5中,上述选项不起作用。请改用以下选项:

ActiveRecord::Type::Boolean.new.cast(value)


1
value_to_boolean方法已被弃用,请使用双重感叹号将任何值转换为布尔值,参见https://dev59.com/gGQn5IYBdhLWcg3wamnO - Alexander Popov
1
双重否定将0转换为true,因此它不会给出与value_to_boolean相同的答案。似乎ActiveRecord::Type::Boolean.new.type_cast_from_database(value)是当前的方法。 - PressingOnAlways
@PressingOnAlways 是的,链接问题中得票更高的答案是更好的答案。 - DickieBoy
3
Rails 5: ActiveRecord::Type::Boolean.new.cast(string) - Darkside

0

可能是您没有允许控制器通过参数接受管理员字段。换句话说,这是一个强参数问题。请确保在您的model_params中允许 :admin。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接