2017-01-31 3 views
0

Simple-Form erkennt automatisch, ob eine validates :xxx, presence: true Validierung vorliegt, und zeigt das Feld als erforderlich an (z. B. mit einem an die Beschriftung angehängten Stern)).Simple-Form und erforderliche Felder: Behandelt nicht wie erforderlich, wenn Bedingung zur Validierung hinzugefügt wurde

validates :parent, presence: true 

Daraus ergibt sich:

asterisk

Interessanterweise sobald ich eine Bedingung dieser Validierung hinzufügen ...

validates :parent, presence: true, if: -> { true } 

... es nicht tun dies nicht mehr:

no asterisk

Ist das ein Fehler oder eine Funktion?

Antwort

1

Dies ist das erwartete Verhalten, Validierungen werden nur ausgeführt, wenn Sie das Objekt in der Datenbank speichern, so dass Sie nicht wissen können, ob das Lambda bis dahin True zurückgibt oder nicht. Natürlich in Ihrem Fall gibt es immer true, aber stellen Sie sich vor, Sie haben eine Zeitbeschränkung in Ihrem Lambda oder einem anderen komplexeren Zustand, z.

...., -> { Time.zone.now > Date.new(2017, 1, 1) } 

Vielleicht, wenn Sie erstellen das Objekt für die Form dieses false zurückgibt, aber wenn das Formular tatsächlich eingereicht wird und gespeichert auf die db genug Zeit vergangen war es true zurückzukehren.

Es gibt also keine Möglichkeit für simple_form zu wissen, wann das Formular erstellt wird, ob das Feld erforderlich ist oder nicht.

0

Sie könnten es eine Funktion nennen, da es absichtlich ist. Wenn Sie sich den Edelstein-Code ansehen (besonders bei calculate_required und conditional_validators?), werden Sie feststellen, dass das Feld nicht mehr wie erforderlich gekennzeichnet ist, wenn der Anwesenheits-Validierer eine Bedingung hat, wie if oder unless.

0

ich so gelöst für :terms Element einer Checkbox zu sein:

validates :terms, presence: true, acceptance: true 

Damit bestätigt sie auf Formularebene zur Überprüfung, dass ‚Begriff‘ Kontrollkästchen nur vorgelegt wird, nachdem es aktiviert ist. Hoffe es hilft jemandem in der Zukunft.

Verwandte Themen