Les messages d'erreur de mon formulaire Rails ressemblent à de la merde avec bootstrap. Est-ce que quelqu'un connaît une solution pour de meilleurs messages d'erreur? J'utilise Rails et Bootstrap.
Ma forme (c'est une aide) est comme ça:
<%= form_for(@user) do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="form-inline">
<%= f.text_field :email, class:'input-large', placeholder:'Test' %>
<!-- </div>
<div class="actions"> -->
<%= f.submit class:'btn btn-large btn-success' %>
</div>
<% end %>
Regardez comment Michael Hartl le fait dans les chemins de fer.
Et c'est le css utilisé:
#error_explanation {
color: #f00;
ul {
list-style: none;
margin: 0 0 18px 0;
}
}
.field_with_errors {
@extend .control-group;
@extend .error;
}
Il décrit tout ici .
Si vous voulez aussi la petite étoile au début de chaque ligne, vous devez l'inclure dans votre formulaire:
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |msg| %>
<li> * <%= msg %></li> <--- insert here
<% end %>
</ul>
</div>
...
Je me rends compte un peu tard, mais avec Rails 4 et Bootstrap 3 aujourd'hui, je me suis retrouvé dans une aide à la visualisation pour afficher les erreurs à l'aide d'un panneau:
Rails 4/Bootstrap 3
def errors_for(object)
if object.errors.any?
content_tag(:div, class: "panel panel-danger") do
concat(content_tag(:div, class: "panel-heading") do
concat(content_tag(:h4, class: "panel-title") do
concat "#{pluralize(object.errors.count, "error")} prohibited this #{object.class.name.downcase} from being saved:"
end)
end)
concat(content_tag(:div, class: "panel-body") do
concat(content_tag(:ul) do
object.errors.full_messages.each do |msg|
concat content_tag(:li, msg)
end
end)
end)
end
end
end
Rails 4/Bootstrap 4 Beta
def errors_for(object)
if object.errors.any?
content_tag(:div, class: "card border-danger") do
concat(content_tag(:div, class: "card-header bg-danger text-white") do
concat "#{pluralize(object.errors.count, "error")} prohibited this #{object.class.name.downcase} from being saved:"
end)
concat(content_tag(:div, class: "card-body") do
concat(content_tag(:ul, class: 'mb-0') do
object.errors.full_messages.each do |msg|
concat content_tag(:li, msg)
end
end)
end)
end
end
end
Rails 4/Variation du groupe de listes bêta Bootstrap 4
def errors_for(object)
if object.errors.any?
content_tag(:div, class: "card border-danger") do
concat(content_tag(:div, class: "card-header bg-danger text-white") do
concat "#{pluralize(object.errors.count, "error")} prohibited this #{object.class.name.downcase} from being saved:"
end)
concat(content_tag(:ul, class: 'mb-0 list-group list-group-flush') do
object.errors.full_messages.each do |msg|
concat content_tag(:li, msg, class: 'list-group-item')
end
end)
end
end
end
Je l'ai déposé dans application_helper et je l'ai appelé dans mes vues de formulaire
<%= errors_for(@user) %>
Peut-être que quelqu'un tombera sur cela et le trouvera utile.
J'ai copié le CSS Bootstrap compilé à partir de
https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css
Recherche de .has-danger
, copie de toutes les classes, recherche et remplacement sur .has-danger
pour .field_with_errors
et ajout du .field_with_errors label
.field_with_errors label,
.field_with_errors .form-control-feedback,
.field_with_errors .form-control-label,
.field_with_errors .col-form-label,
.field_with_errors .form-check-label,
.field_with_errors .custom-control {
color: #d9534f;
}
.field_with_errors .form-control {
border-color: #d9534f;
}
.field_with_errors .input-group-addon {
color: #d9534f;
border-color: #d9534f;
background-color: #fdf7f7;
}
.field_with_errors .form-control-danger {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23d9534f' viewBox='-2 -2 7 7'%3E%3Cpath stroke='%23d9534f' d='M0 0l3 3m0-3L0 3'/%3E%3Ccircle r='.5'/%3E%3Ccircle cx='3' r='.5'/%3E%3Ccircle cy='3' r='.5'/%3E%3Ccircle cx='3' cy='3' r='.5'/%3E%3C/svg%3E");
}
Je n’ai pas pu obtenir l’affichage correct des addons des groupes d’entrée, car il encapsule l’entrée avec un <div>
.
Docs: https://v4-alpha.getbootstrap.com/components/forms/#validation
Honnêtement, certaines de ces classes ne sont pas utilisées car Rails ne dispose pas d'un moyen évident de définir des classes sur des champs d'erreur.
Pour la liste des erreurs, je viens d'utiliser cette classe simple
#error_explanation {
color: red;
}
J'ai implémenté l'assistant de vue de Rabbott dans Rails 5 et Bootstrap 4:
def errors_for(object)
if object.errors.any?
content_tag(:div, class: 'card text-white bg-danger mb-3') do
concat(content_tag(:div, class: 'card-header') do
concat(content_tag(:h4) do
concat "#{pluralize(object.errors.count, 'error')} prohibited this #{object.class.name.downcase} from being saved:"
end)
end)
concat(content_tag(:div, class: 'card-body') do
concat(content_tag(:ul) do
object.errors.full_messages.each do |msg|
concat content_tag(:li, msg)
end
end)
end)
end
end
end
Une solution plus simple est peut-être la recherche d’id et de classes sur le formulaire lui-même. Fonctionne pour n'importe quel combo.
Par défaut, ce sont les lignes incluses dans l'échafaudage pour organiser les messages d'erreur. Vous pouvez en faire ce que vous voulez. Il suffit de les étendre dans votre fichier css.scss:
.field_with_errors {
padding: 2px;
background-color: red;
display: table;
}
#error_explanation {
width: 450px;
border: 2px solid red;
padding: 7px 7px 0;
margin-bottom: 20px;
background-color: #f0f0f0;
}
#error_explanation h2 {
text-align: left;
font-weight: bold;
padding: 5px 5px 5px 15px;
font-size: 12px;
margin: -7px -7px 0;
background-color: #c00;
color: #fff;
}
#error_explanation ul li {
font-size: 12px;
list-style: square;
}
Si quelque chose ne fonctionne pas, vérifiez le navigateur en mode développeur. Vous devriez pouvoir y trouver tout le code html et css créé par Rails ...