[RAILS] Le message d'erreur du périphérique ne s'affiche pas correctement.

Aperçu

Le message d'erreur du périphérique ne s'est pas bien affiché, alors j'ai compris pourquoi. Ce n'est pas une solution, mais j'ai appris un peu comment fonctionne decvise, donc je vais le laisser comme un mémorandum.

Solution

Lors de l'appel d'un modèle partiel, le nom de la variable a été changé de «ressource» à «@ nom du modèle» dans le modèle.

Message d'erreur


<%= render "devise/shared/error_messages", resource: resource %>
↓
<%= render "devise/shared/error_messages", resource: @profile %>

Étant donné que devise est un framework capable de gérer plusieurs instances de modèle, il semble que la ressource puisse bien le gérer. ](Https://teratail.com/questions/139633) En fait, il semble y avoir un autre processus, mais si j'ai changé cela en @ nom du modèle, cela a fonctionné.

Autre code

routage

Étant donné que l'enregistrement de l'utilisateur et l'enregistrement du profil sont au format assistant, le profil est traité par le contrôleur «utilisateurs / enregistrement».

routes.rb


Rails.application.routes.draw do
  devise_for :users, controllers: {
    registrations: 'users/registrations'
  }
  devise_scope :user do
    get 'profiles', to: 'users/registrations#new_profile'
    post 'profiles', to: 'users/registrations#create_profile'
  end
end

Conception de table

J'utilise devise pour stocker les informations utilisateur dans les tables des utilisateurs et des profils.

schema.rb


#La table des utilisateurs et la table des profiels ressemblent à ceci.

  create_table "profiles", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "favorite_beer"
    t.text "twitter_link"
    t.text "info"
    t.bigint "user_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["user_id"], name: "index_profiles_on_user_id"
  end

  
  create_table "users", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "nickname", null: false
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

formulaire de saisie

La vue de l'enregistrement du profil ressemble à ceci. Le message d'erreur est appelé ici dans le modèle partiel, mais il semble que les informations de la table des profils n'ont pas pu lui être transmises.

new_profile


<h2>Enregistrement de profil</h2>
<%= form_with model: @profile, local: true do |f| %>
  <%= render "devise/shared/error_messages", resource: @profile %>

  <div class="field">
    <%= f.label :avatar %><br />
    <%= f.file_field :avatar %>
  </div>

  <div class="field">
    <%= f.label :favorite_beer %><br />
    <%= f.text_field :favorite_beer, autofocus: true, autocomplete: "favorite_beer" %>
  </div>

  <div class="field">
    <%= f.label :twitter_link %><br />
    <%= f.text_field :twitter_link, autocomplete: "twitter_link" %>
  </div>

  <div class="field">
    <%= f.label :info %><br />
    <%= f.text_area :info %>
  </div>

  <div class="actions">
    <%= f.submit "s'inscrire" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>

Appelant du message d'erreur

Le message d'erreur de l'appareil appelé dans le modèle partiel est le suivant

erb:divese/shared/_error_messages.html.erb


<% if resource.errors.any? %>
<%#Vers la ressource de cette ↑ partie@Profil passé%>
  <div id="error_explanation">
    <h2>
      <%= I18n.t("errors.messages.not_saved", #La description ici est de concevoir.ja.Décrit en yml
                 count: resource.errors.count,
                 resource: resource.class.model_name.human.downcase)
       %>
    </h2>
    <ul>
      <% resource.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
    </ul>
  </div>
<% end %>

Un fichier qui traduit la devise en japonais

Comme devise a déjà été traduit en japonais, le fichier yml est également traduit en japonais.

yml:config/locales/devise.ja.yml


ja:
  activerecord:
    attributes:
# ~réduction~     
    models:
      user:Utilisateur
      profile:profil#Je l'ai ajouté parce que je voulais aussi le traduire en japonais.
# ~réduction~
  errors:
    messages:
      already_confirmed:Est déjà enregistré. Veuillez vous connecter.
      confirmation_period_expired:A expiré.%{period}Vous devez confirmer par. Veuillez faire une nouvelle demande.
      expired:A expiré. Veuillez faire une nouvelle demande.
      not_found:N'a pas été trouvé.
      not_locked:N'est pas gelé.
#Ce n'est pas_Il semble que le lieu enregistré soit appelé par le modèle partiel
      not_saved:
        one:Parce qu'une erreur s'est produite%{resource}N'a pas été sauvé.
        other: "%{count}Parce qu'une erreur s'est produite%{resource}N'a pas été sauvé."

Sommaire

J'aimerais continuer à étudier à l'avenir. Si cette phrase contient un malentendu ridicule, veuillez le signaler.

Recommended Posts

Le message d'erreur du périphérique ne s'affiche pas correctement.
[Erreur] L'application ne s'affiche pas dans l'environnement de production
[Rails] À propos de l'erreur selon laquelle l'image n'est pas affichée dans l'environnement de production
Lorsque le projet n'est pas affiché dans eclipse
Aucun message d'erreur ne s'affiche lorsque l'action de création échoue
"tx" n'est pas une erreur liée
[Rails] fields_for n'est pas affiché
L'idée de couper quand l'erreur n'est pas résolue
[Rails] Lorsque le changement de disposition du dispositif n'est pas reflété
L'erreur de remplacement final [Java] ne s'affiche pas au moment de la compilation
[Rails] Quel était le message d'erreur?
À propos du problème selon lequel l'image n'est pas affichée après le déploiement AWS
Le référentiel ... n'est pas une erreur signée dans docker build apt-get update
Comment le site Web s'affiche à l'écran
L'image n'est pas affichée dans l'environnement de production
Obtenez un message d'erreur en utilisant n'importe quelle méthode?
Ajouter si non dans l'ensemble, message d'erreur si
[Cloud9] Yay! You are on Rails! N'est pas affiché dans le didacticiel sur les rails
[Rails] Que faire lorsque l'image Refile n'est pas affichée lors de l'écriture du traitement au moment de l'erreur de routage
Si la version JDK est correcte dans Eclipse mais qu'une erreur se produit ou que le compilateur ne fonctionne pas correctement
Possibilité lors du déploiement sur EC2 mais rien n'est affiché dans le journal des erreurs
[Java] Lisez-vous correctement le message d'erreur? [Comment lire la trace de la pile]
Le trait de soulignement ActiveSupport n'est pas la conversion inverse de camelize
La route vers la japonaisisation des rails conçoit des messages d'erreur
[Rails] Traduisons le message d'erreur en japonais
La clé publique pour jenkins-2.249.1-1.1.noarch.rpm n'est pas installée
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Ebean.update () n'est pas exécuté dans le modèle hérité.
Turbolinks: je veux résoudre le problème que JS ne s'affiche pas correctement à moins d'être rechargé lors de la transition avec link_to
[Ruby on rails] Lors de l'exécution de la commande heroku, bash: heroku: command not found s'affiche. [Tutoriel Rails]
[Android Studio] À propos du fait que la vue de conception n'est pas affichée lors de l'utilisation de TextClock
Docker Compose ne démarre pas avec l'affichage d'erreur docker.credentials.errors.InitializationError
PATH ne passe pas ... La cause est le code du caractère
Erreur "Ce n'est pas le bon paquet! Veuillez installer eslint-plugin-jsx-a11y"
Lors de la modification des informations utilisateur à l'aide des paramètres du périphérique sur l'écran d'édition lorsque le mot de passe n'est pas enregistré
[Rails] Que faire lorsque la vue se réduit lorsqu'un message est affiché avec la méthode des erreurs