[RUBY] Die Rails-API verhindert, dass Boolesche Werte willkürlich umgewandelt und die Validierung bestanden werden

Veranstaltung

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

Gegenmaßnahmen

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

Ergebnis

$ 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

Referenz

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

Die Rails-API verhindert, dass Boolesche Werte willkürlich umgewandelt und die Validierung bestanden werden
[Rails] [jQuery] Verhindert, dass die Senden-Schaltfläche gedrückt wird, bis das Formular ausgefüllt und ausgewählt wird.
[Rails] Validierungseinstellungen und japanische Lokalisierung