rails check_box在未选中时未传递false

时间:2013-12-27 04:36:03

标签: ruby-on-rails checkbox devise

我仍然遇到Ruby on Rails中这个烦人的check_box内容的问题。我现在正在进行授权,我有一个User类来这样做。我已经安装并设置了Devise来完成繁重的工作。用户有一个is_teacher变量来指示该用户是否为教师,因此可以执行更多操作。问题是,当取消选中复选框时,check_box es不会为该变量传递false。注册视图是最简单的,所以我会发布:

<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.label :password %><br />
  <%= f.password_field :password %></div>

  <div><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></div>

  <div><%= f.check_box :is_teacher %> <%= f.label :is_teacher, "I am a Teacher" %></div>

  <div><%= f.submit "Sign up" %></div>
<% end %>

<%= render "devise/shared/links" %>

据我了解,f.check_box :is_teacher应正确更新is_teacher变量。当我选中该框时(即,然后授予用户教师权限),它会这样做。但是,当我取消选中该框或未选中该框时,它会给我一个错误,指出is_teacher变量不能为空。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我打算把它写成评论,但在这里阅读会更容易:

HTML表单不会为未选中的复选框发送“false”值 - 它们只发送选中的值。我可能错了,但是如果你对表单的数据执行.serialize()函数,你只会获得checked值,然后传递给控制器​​

为了适应这种情况,您必须在数据库中将is_teacher列设置为boolean。原因是如果您不发送true,它将默认为false(0),允许您忽略发送false

答案 1 :(得分:0)

我不确定发生了什么,但现在似乎正在运作。

我怀疑我的部分问题可能是我尝试解决方案。当我注意到is_teacher变量在我取消选中框时没有更新时,我在user.rb文件中添加了一行,明确验证了正在给出的值:validates is_teacher, presence:true可悲的是,我认为这对我来说是适得其反的,即使给定的值是“假的”也是失败的,该视图本来可以毫无问题地使用。

无论如何,既然我已经删除了验证,那么一切都运行得很好。我只是希望我知道我原来的bug在哪里。谢谢大家的帮助! :d