Rails 单选按钮将 true 和 false 作为字符串传递



现在,这就是我在Rails应用程序中创建单选按钮的方式:

<div class="form-group row">
<%= form.label :exclusion, class: "col-sm-3 col-form-label", for: 'scope_exclusion' %>
<div class="col-sm-9 col-lg-9 col-12 pt-2 pl-3">
<div class="radio radio-success form-check-inline">
<%= form.radio_button :exclusion, true %>
<label for="scope_exclusion_true"> Yes </label>
</div>
<div class="radio radio-danger form-check-inline">
<%= form.radio_button :exclusion, false %>
<label for="scope_exclusion_false"> No </label>
</div>
</div>
</div>

问题是,当它到达控制器时,参数如下所示:

{"exclusion"=>"false"}

但是,这似乎没有进入数据库,尽管没有任何错误。例如

2.5.8 :014 > Scope.last.update(exclusion: "true")
Scope Load (1.1ms)  SELECT  "scopes".* FROM "scopes" ORDER BY "scopes"."id" DESC LIMIT $1  [["LIMIT", 1]]
(0.5ms)  BEGIN
Scope Update (0.8ms)  UPDATE "scopes" SET "exclusion" = $1, "updated_at" = $2 WHERE "scopes"."id" = $3  [["exclusion", 0], ["updated_at", "2020-06-03 17:44:18.296337"], ["id", 1057]]
(0.4ms)  COMMIT
=> true
2.5.8 :015 > Scope.last.exclusion
Scope Load (1.1ms)  SELECT  "scopes".* FROM "scopes" ORDER BY "scopes"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> 0
2.5.8 :016 >

这不起作用,但是如果我传递值true而不是"true",那么它就可以工作,如下所示:

2.5.8 :016 > Scope.last.update(exclusion: true)
Scope Load (1.2ms)  SELECT  "scopes".* FROM "scopes" ORDER BY "scopes"."id" DESC LIMIT $1  [["LIMIT", 1]]
(0.9ms)  BEGIN
Scope Update (0.7ms)  UPDATE "scopes" SET "exclusion" = $1, "updated_at" = $2 WHERE "scopes"."id" = $3  [["exclusion", 1], ["updated_at", "2020-06-03 17:44:43.940131"], ["id", 1057]]
(0.5ms)  COMMIT
=> true
2.5.8 :017 > Scope.last.exclusion
Scope Load (1.2ms)  SELECT  "scopes".* FROM "scopes" ORDER BY "scopes"."id" DESC LIMIT $1  [["LIMIT", 1]]
=> 1

如何调整我的 HTML 表单,使其实际传递布尔truefalse,而不是"true""false"

通过将值从true更改为1false将值更改为0,这似乎解决了我的问题。我意识到数据库字段不是设置为布尔值,而是设置为实际整数,因此解释了原因:

<div class="form-group row">
<%= form.label :exclusion, class: "col-sm-3 col-form-label", for: 'scope_exclusion' %>
<div class="col-sm-9 col-lg-9 col-12 pt-2 pl-3">
<div class="radio radio-success form-check-inline">
<%= form.radio_button :exclusion, "1" %>
<label for="scope_exclusion_true"> Yes </label>
</div>
<div class="radio radio-danger form-check-inline">
<%= form.radio_button :exclusion, "2" %>
<label for="scope_exclusion_false"> No </label>
</div>
</div>
</div>

最新更新