Comment puis-je faire fonctionner f.error_messages ici, ou dois-je utiliser des flashs?
Si oui, qu'est-ce qui devrait remplacer dans le sessions_controller?
<h2>Create an account</h2>
<% form_for resource_name, resource, :url => registration_path(resource_name) do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :email %><br />
<%= f.text_field :email, :class => :big %>
</p>
<p>
<%= f.label :password %><br />
<%= f.password_field :password, :class => :big %>
</p>
<p>
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, :class => :big %>
</p>
<p><%= f.submit "Create", :class => :submit %></p>
<% end %>
PS. f.error_messages pour la création d'un compte fonctionne parfaitement.
Certes, un peu hacky, mais j'utilise cet assistant (app/helpers/devise_helper.rb) pour récupérer les flashs et les utiliser s'ils sont définis, puis par défaut sur resource.errors
.
module DeviseHelper
def devise_error_messages!
flash_alerts = []
error_key = 'errors.messages.not_saved'
if !flash.empty?
flash_alerts.Push(flash[:error]) if flash[:error]
flash_alerts.Push(flash[:alert]) if flash[:alert]
flash_alerts.Push(flash[:notice]) if flash[:notice]
error_key = 'devise.failure.invalid'
end
return "" if resource.errors.empty? && flash_alerts.empty?
errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages
messages = errors.map { |msg| content_tag(:li, msg) }.join
sentence = I18n.t(error_key, :count => errors.count,
:resource => resource.class.model_name.human.downcase)
html = <<-HTML
<div id="error_explanation">
<h2>#{sentence}</h2>
<ul>#{messages}</ul>
</div>
HTML
html.html_safe
end
end
essayez de les mettre dans votre mise en page:
<%= content_tag(:div, flash[:error], :id => "flash_error") if flash[:error] %>
<%= content_tag(:div, flash[:notice], :id => "flash_notice") if flash[:notice] %>
<%= content_tag(:div, flash[:alert], :id => "flash_alert") if flash[:alert] %>
L'action de connexion dans Devise définit les messages flash, pas les erreurs de modèle.
Malgré l'âge de ce poste, je voulais partager une solution pour aider des gens comme moi qui ont eu des problèmes lorsqu'ils ont commencé à utiliser Devise. Pour garder les choses DRY Je viens de finir par insérer ce code dans mon application.html.erb
fichier:
<body>
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
<%= yield %>
</body>
Cela doit également
<% flash.each do |name, msg| %>
<%= content_tag :div, msg, id: "flash_#{name}" %>
<% end %>
Créer un assistant
# app/helpers/application_helper.rb
module ApplicationHelper
def flash_class(level)
case level
when 'info' then "alert alert-info"
when 'notice','success' then "alert alert-success"
when 'error' then "alert alert-danger"
when 'alert' then "alert alert-warning"
end
end
end
#view
<% flash.each do |key, value| %>
<div class="<%= flash_class(key) %> fade in">
<a href="#" class="close" data-dismiss="alert">×</a>
<%= value %>
</div>
<% end %>