37 votes

Rails - Devise - Messages d'erreur lors de la connexion?

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.

66voto

ffoeg Points 1850

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.

33voto

typeoneerror Points 19087

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
 

6voto

Carl Edwards Points 319

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 au SEC, je viens d'insérer ce code dans mon fichier application.html.erb :

 <body>
  <% flash.each do |key, value| %>
    <div class="flash <%= key %>"><%= value %></div>
  <% end %>

  <%= yield %>
</body>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X