复选框说,即使未选中该值也始终为1?

时间:2018-07-06 14:46:29

标签: ruby-on-rails

我的html看起来像这样:

<%= form_for(@quote) do |f| %>
  <div class="field" id="follow_up">
    <%= f.label "Follow up?" %>
    <%= f.check_box :follow_up %>
  </div>
<% end %>

我的控制器操作包含以下内容:

@quote.follow_up = :follow_up

无论是否选中复选框,follow_up字段始终更新为1。如何使follow_up如果未选中则设置为0,而如果选中则设置为1?

这是报价表的架构(受限):

mysql> describe quotes;
+----------------------+---------------+------+-----+------------+----------------+
| Field                | Type          | Null | Key | Default    | Extra          |
+----------------------+---------------+------+-----+------------+----------------+
| id                   | int(11)       | NO   | PRI | NULL       | auto_increment |
| created_at           | datetime      | NO   |     | NULL       |                |
| updated_at           | datetime      | NO   |     | NULL       |                |
| follow_up            | tinyint(1)    | NO   |     | 0          |                |
| follow_up_date       | date          | NO   |     | 1970-01-01 |                |
+----------------------+---------------+------+-----+------------+----------------+

这是我在运行@Carl Markham的代码时收到的MySql错误:

Mysql2::Error: Column 'follow_up' cannot be null: INSERT INTO `quotes` (`quote_number`, `created_at`, `updated_at`, `date`, `customer_id`, `dealerperson_id`, `shiptolocation_id`, `binmodel_id`, `bindescription`, `binprice`, `binmodel_quantity`, `quoted_by`, `quote_method`, `discount_percent`, `freightcharge_id`, `tax_percent`, `quoted_price`, `notes`, `fobandterm_id`, `price_year`, `last_user_initials`, `follow_up`) VALUES ('180706-050', '2018-07-06 16:53:44', '2018-07-06 16:53:44', '2018-07-06', 4251, 1, 500, 150, 'Hopper Bin - 4000 Bushel Capacity', 16090.0, 1, 'BK', 'mailed', 20.0, 4100, 5.0, 13515.6, '', 1, 2018, 'BK', NULL)

您可以看到,所有值都有一个值,但最后一个值是NULL。 这是完整的请求:

{"utf8"=>"✓",
 "authenticity_token"=>"vix6La7GcxEGxSrlRfEYvkuEAQddXGpZhn2NQ/HnT5ccACb5HB1hBds+mfbbEN6w+gMK7qQcV4hdkUsJ7uq3OA==",
 "quote"=>
  {"date"=>"2018-07-06",
   "quoted_price"=>"$12872.00",
   "notes"=>""
   "follow_up"=>"1"},
 "commit"=>"Create"}

2 个答案:

答案 0 :(得分:1)

您的代码唯一的错误是:

# Controller
@quote.follow_up = :follow_up

您要在此处将Symbol分配给属性follow_up。您需要访问params中的值。将上面的语句替换为:

@quote.follow_up = params[:quote][:follow_up] == '1'

比较运算符==始终返回Boolean值。因此,这将始终将follow_up设置为truefalse

改进:如果要阻止将NULL值保存在属性follow_up中,最好在模型级别进行检测。为此在模型中添加一个验证。像这样:

# Model Quote (or whatever)
validates :follow_up, inclusion: { in: [true, false] }

它将为@quote对象添加一个不错的错误消息,而不仅仅是抛出MySQL错误。

答案 1 :(得分:0)

那是因为你在这里做什么

@quote.follow_up = :follow_up

正在将follow_up的值设置为符号:follow_up

我假设数据库中的follow_up字段设置为整数,这就是为什么在您的情况下该值始终为1(符号为阈值)的原因。

您需要做的就是从params中获取值

@quote.follow_up = params[:follow_up]

如果参数存在,则选中该复选框。如果不存在,则未选中该复选框。