[RAILS] Option pour spécifier le moment de l'exécution de la validation [on:]

Introduction / Situation lorsqu'une erreur survient

Rails met en œuvre quelque chose comme une application de calendrier (guide de voyage). Précisez la date, les détails, les membres (en utilisant la fonction d'enregistrement utilisateur de l'appareil), Enregistrez la page de voyage.

Utilisateurs participants (utilisateurs) de la page de voyage (voyages) Comme le montre la figure ci-dessous, une table intermédiaire appelée trip_users est utilisée pour former une association plusieurs-à-plusieurs.

スクリーンショット 2020-11-15 16 14 29

Si vous remplissez les éléments requis et vous inscrivez Sur la table des voyages スクリーンショット 2020-11-15 16 19 20

Dans la table trip_users スクリーンショット 2020-11-15 16 21 03

Il sera sauvé comme ça.

Cependant, alors que nous procédons à la mise en œuvre ...

スクリーンショット 2020-11-15 16 03 24

Avec une erreur que je n'ai jamais vue, je suis soudainement devenu incapable d'enregistrer ma page de voyage.

Environnement de développement

Ruby 2.6.5 Rails 6.0.3.4 MySQL Visual Studio Code (GoogleChrome)

Examen et vérification de la cause

J'ai confirmé le processus de création dans binding.pry.

[1] pry(#<TripsController>)> trip_params
=> <ActionController::Parameters {
(Omission)

 "user_ids"=>["", "2", "3", "4", "5", "6", "1"]} permitted: true>
[2] pry(#<TripsController>)> @trip = Trip.new(trip_params)
(Omission)

[3] pry(#<TripsController>)> @trip.valid?
=> false
[4] pry(#<TripsController>)> @trip.errors.full_messages
=> ["Les membres participants sont des valeurs non valides"]

Les utilisateurs participants sont envoyés avec des identifiants stockés dans user_ids dans les paramètres. D'un autre côté, il semble qu'il s'agisse d'une "valeur illégale". Qu'est-ce qui a mal tourné quand ce n'était pas du tout faux il y a quelque temps ...

Si vous vous souvenez de ce que vous avez fait récemment, si vous avez la moindre idée d'une erreur ...

"Au fait, je n'ai pas écrit la validation alphanumérique mixte du mot de passe ~"

J'ai soudainement trouvé une description dont je me souviens et que j'ai écrite.

user.rb


class User < ApplicationRecord
 (Omission)

  PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze #Expression régulière alphanumérique mixte
  validates :password, format: { with: PASSWORD_REGEX, message: 'Veuillez inclure des lettres et des chiffres' }
end

Quand j'ai essayé de commenter ... je suis de retour! Il semble que ce soit la cause ...

Apparemment, la validation alphanumérique mixte définie dans le mot de passe lors de l'enregistrement d'un nouvel utilisateur a été activée lorsque l'autre modèle auquel il était associé a été généré? il semble que. Il est probable qu'il ait joué "Veuillez mélanger les caractères alphanumériques!" Pour user_ids, qui ne sont que des données numériques. Il y a un cas si rare ...

Ensuite, est-il possible d'appliquer cette ** validation uniquement à l'enregistrement de l'utilisateur **? À la suite d'une enquête ...

[Official] Rails Document / validates

スクリーンショット 2020-11-15 16 29 30

Cela semble utilisable!

résultat

Vous pouvez spécifier le moment de l'exécution de la validation avec l'option : on. Cette fois, nous voulons exécuter la validation du mot de passe uniquement lors de l'enregistrement en tant qu'utilisateur, alors écrivez on :: create.

↓ Modèle utilisateur modifié

user.rb


class User < ApplicationRecord
 (Omission)

  PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?\d)[a-z\d]+\z/i.freeze #Expression régulière alphanumérique mixte
  validates :password, format: { with: PASSWORD_REGEX, message: 'Veuillez inclure des lettres et des chiffres' }, on: :create
end

Cela laissera la validation du mot de passe La fonction d'enregistrement de la page de voyage est revenue à la même chose qu'avant!

À la fin / impression

Il m'a fallu un certain temps pour trouver la description causale. J'ai aussi appris l'importance de m'engager sur les beans pour pouvoir revenir en arrière en cas d'erreur ...

C'est un mauvais article pour les débutants, mais j'espère qu'il vous sera utile. Merci d'avoir lu jusqu'au bout.

Article de référence

[Official / Rails Guide] Active Record Validation [Official] Rails Document / validates [Qiita] Validation du commutateur à exécuter lors de la sauvegarde en fonction de la situation [Qiita] Rails | Spécifiez le délai de validation en utilisant l'option On

Recommended Posts

Option pour spécifier le moment de l'exécution de la validation [on:]
[Validation] rails Comment spécifier après la date d'aujourd'hui
Installez MySQL 5.6 sur CentOS6 [Comment spécifier la version]