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.
Si vous remplissez les éléments requis et vous inscrivez Sur la table des voyages
Dans la table trip_users
Il sera sauvé comme ça.
Cependant, alors que nous procédons à la mise en œuvre ...
Avec une erreur que je n'ai jamais vue, je suis soudainement devenu incapable d'enregistrer ma page de voyage.
Ruby 2.6.5 Rails 6.0.3.4 MySQL Visual Studio Code (GoogleChrome)
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
Cela semble utilisable!
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!
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.
[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