1. Conclusion </ b>
2. Comment désactiver le regroupement des erreurs </ b>
3. Où il se coince </ b>
Utilisez valide </ b>, .errors.any </ b> et .errors.full_messages.each </ b>!
Tout d'abord, définissez la validation sur le modèle!
app/models/buy_item
with_options presence: true do
validates :name
validates :date
end
With_options vous permet de définir la présence: true (les espaces ne sont pas autorisés) de faire à la fin d'un côté. Dans ce cas, les espaces dans la colonne de nom et la colonne de date sont définis comme inutiles!
Et dans le contrôleur, c'est comme suit.
controllers/buy_items_controller.rb
def create
@buy_item = BuyItem.new(buy_item_params)
if @buy_item.save
redirect_to root_path
else
render :new
end
end
S'il est enregistré, il passera à la première page. Si quelque chose ne va pas et qu'il n'est pas enregistré, le rendu passera à la nouvelle vue. Parce que je veux faire ce qui suit.
views/buy_items/new.html.erb
<%= render 'public/error_messages', model: f.object %>
En faisant cela, lorsque vous passez à la nouvelle vue de buy_items (render: new), vous serez redirigé vers le programme pour lequel l'affichage d'erreur est défini. f.object est | f | de @buy_item défini dans form_wtih, et le contenu de @buy_item est retiré!
Le contenu (phrases d'erreur) de "messages_public / d'erreur" est le suivant.
view/public/_error_messages
<% if model.errors.any? %>
<div class="error">
<ul>
<% model.errors.full_messages.each do |message| %>
<li class='error-message'><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
J'utilise model car j'utilise user en plus du modèle buy_item. Vous pouvez appliquer le contenu d'erreur de validation à tous les modèles. De plus, chaque contenu d'erreur est extrait par chaque méthode et affiché par <% = message%>!
L'URL ci-dessous m'a beaucoup aidé!
URL de référence: Comment émettre le message d'erreur Rails Erreur de validation
J'ai changé le modèle en @user ou @buy_item, et j'ai eu un problème parce que l'erreur @user ne s'est pas produite ou que la méthode NameErrormethod s'est produite. De plus, f.object a également été transformé en variable d'instance sans autorisation, provoquant une erreur supplémentaire. De plus, si vous avez deux contrôleurs et que vous souhaitez les afficher avec l'index du contrôleur spécifié, vous pouvez utiliser le rendu "nom du contrôleur / nom de l'action". Cependant, comme il n'est affiché que, c'était un point aveugle que je devais décrire les données à l'intérieur.
Recommended Posts