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.
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é.
É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
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
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" %>
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 %>
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é."
J'aimerais continuer à étudier à l'avenir. Si cette phrase contient un malentendu ridicule, veuillez le signaler.
Recommended Posts