web-dev-qa-db-fra.com

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.

36
Frexuz

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
32
typeoneerror

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.

65
ffoeg

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>
5
Carl Edwards

Cela doit également

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, id: "flash_#{name}" %>
<% end %>
3
Sachin

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">&times;</a>
      <%= value %>
   </div>
<% end %>
0
gilcierweb