J'ai un formulaire avec des champs/étiquettes de saisie, etc. Comment puis-je faire apparaître le message d'erreur à côté du champ? au lieu de s'agglutiner au sommet?
J'utilise devise, Rails 3
J'ai ceci en haut de mon formulaire:
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
- if resource.errors.any?
#errorExplanation
%h2
= pluralize(resource.errors.count, "error")
prevented this user from being saved:
%ul
- resource.errors.full_messages.each do |msg|
%li
= msg
Vous pouvez utiliser ceci
- if @resource.errors[:field_name]
...
Lien également utile:
http://guides.rubyonrails.org/active_record_validations.html#working-with-validation-errors
Créez simplement un fichier dans votre dossier initialiseurs.
config/initializers/inline_errors.rb
Placez ce code dedans:
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
unless html_tag =~ /^<label/
%{<div class="has-error">#{html_tag}<span class="help-block">#{instance.error_message.first}</span></div>}.html_safe
else
%{#{html_tag}}.html_safe
end
end
PD: Désolé pour mon anglais.
Que dis-tu de ça
si vous voulez mettre le message d'erreur juste en dessous du champ de texte, vous pouvez faire comme ça
.row.spacer20top
.col-sm-6.form-group
= f.label :first_name, "*Your First Name:"
= f.text_field :first_name, :required => true, class: "form-control"
= f.error_message_for(:first_name)
Qu'est-ce que error_message_for
?
-> Eh bien, c'est un beau hack pour faire des trucs sympas
# Author Shiva Bhusal
# Aug 2016
# in config/initializers/modify_Rails_form_builder.rb
# This will add a new method in the `f` object available in Rails forms
class ActionView::Helpers::FormBuilder
def error_message_for(field_name)
if self.object.errors[field_name].present?
model_name = self.object.class.name.downcase
id_of_element = "error_#{model_name}_#{field_name}"
target_elem_id = "#{model_name}_#{field_name}"
class_name = 'signup-error alert alert-danger'
error_declaration_class = 'has-signup-error'
"<div id=\"#{id_of_element}\" for=\"#{target_elem_id}\" class=\"#{class_name}\">"\
"#{self.object.errors[field_name].join(', ')}"\
"</div>"\
"<!-- Later JavaScript to add class to the parent element -->"\
"<script>"\
"document.onreadystatechange = function(){"\
"$('##{id_of_element}').parent()"\
".addClass('#{error_declaration_class}');"\
"}"\
"</script>".html_safe
end
rescue
nil
end
end
Annotation générée après une erreur
<div id="error_user_first_name" for="user_first_name" class="signup-error alert alert-danger">This field is required.</div>
<script>document.onreadystatechange = function(){$('#error_user_first_name').parent().addClass('has-signup-error');}</script>
SCSS correspondant
.has-signup-error{
.signup-error{
background: transparent;
color: $brand-danger;
border: none;
}
input, select{
background-color: $bg-danger;
border-color: $brand-danger;
color: $gray-base;
font-weight: 500;
}
&.checkbox{
label{
&:before{
background-color: $bg-danger;
border-color: $brand-danger;
}
}
}
Remarque: Bootstrap utilisées ici et, n'oubliez pas de Redémarrer le serveur maintenant et après toute modification du fichier dans le répertoire de configuration.
Vous pouvez utiliser error_message_on http://apidock.com/Rails/ActionView/Helpers/ActiveRecordHelper/error_message_on
form.error_messages a été supprimé de Rails et est maintenant disponible en tant que plugin. Veuillez l'installer avec Rails plugin install git://github.com/Rails/dynamic_form.git
.