我的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"}
答案 0 :(得分:1)
您的代码唯一的错误是:
# Controller
@quote.follow_up = :follow_up
您要在此处将Symbol
分配给属性follow_up
。您需要访问params
中的值。将上面的语句替换为:
@quote.follow_up = params[:quote][:follow_up] == '1'
比较运算符==
始终返回Boolean
值。因此,这将始终将follow_up
设置为true
或false
。
改进:如果要阻止将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]
如果参数存在,则选中该复选框。如果不存在,则未选中该复选框。