Beim Erstellen und Aktualisieren einer Spalte vom Typ Boolean mit der Rails-API möchte ich andere Typen als Boolean spielen
$ rails -v
Rails 6.0.3.2
$ rails g model Post body:text opened:boolean
app/models/post.rb
class Post < ApplicationRecord
validates :opened, inclusion: { in: [true, false]}
end
Wenn Sie dies tun, sollten Sie in der Lage sein, alles außer dem Booleschen ...
$ curl localhost:3000/posts -X POST -H "Content-Type: application/json" -d '{"body": "hoge", "opened": "moge"}'
{"status":"success","data":{"id":1,"body":"hoge","opened":true,"created_at":"2020-08-16T01:31:14.277Z","updated_at":"2020-08-16T01:31:14.277Z"}}
Geben Sie "moge" für die offene Spalte von boolean an
Erwartung: Da es nicht boolesch ist, wird es mit einem Fehler abgespielt Aktueller Zustand: In true umgewandelt und fehlerfrei gespeichert
$ curl localhost:3000/posts -X POST -H "Content-Type: application/json" -d '{"body": "hoge", "opened": "0"}'
{"status":"SUCCESS","data":{"id":2,"body":"hoge","opened":false,"created_at":"2020-08-16T01:31:28.498Z","updated_at":"2020-08-16T01:31:28.498Z"}}
Erwartung: Da es nicht boolesch ist, wird es mit einem Fehler abgespielt Tatsächlicher Zustand: In false umgewandelt und fehlerfrei gespeichert
Anscheinend scheint der Wert im Besetzungszustand übergeben zu werden
Nehmen Sie eine benutzerdefinierte Validierung vor
app/validators/boolean_validator.rb
class BooleanValidator < ActiveModel::EachValidator
def validate_each(record, attr, _value)
before_value = record.send("#{attr}_before_type_cast")
record.errors.add(attr, "is invalid") unless %w[true false].include?(before_value.to_s.downcase)
end
end
app/models/post.rb
class Post < ApplicationRecord
validates :opened, boolean: true
end
$ curl localhost:3000/posts -X POST -H "Content-Type: application/json" -d '{"body": "hoge", "opened": "moge"}'
{"status":"error","data":{"opened":["is invalid"]}}
$ curl localhost:3000/posts -X POST -H "Content-Type: application/json" -d '{"body": "hoge", "opened": "0"}'
{"status":"error","data":{"opened":["is invalid"]}}
$ curl localhost:3000/posts -X POST -H "Content-Type: application/json" -d '{"body": "hoge", "opened": "true"}'
{"status":"success","data":{"id":3,"body":"hoge","opened":true,"created_at":"2020-08-16T02:25:18.211Z","updated_at":"2020-08-16T02:25:18.211Z"}}
$ curl localhost:3000/posts -X POST -H "Content-Type: application/json" -d '{"body": "hoge", "opened": "false"}'
{"status":"success","data":{"id":4,"body":"hoge","opened":false,"created_at":"2020-08-16T02:25:30.700Z","updated_at":"2020-08-16T02:25:30.700Z"}}
Wie erwartet werden jetzt alle außer wahr und falsch gespielt
So überprüfen Sie eine Spalte vom Typ Boolean in Rails und geben sie als Fehler zurück, wenn der Typ unterschiedlich ist Wenn Sie es mit der obigen URL implementieren, wird es auf verschiedene Weise in Rubocop gefangen, also schreibe ich diesen Artikel
Recommended Posts