in my user edit page, there is a line as follows:
<%= devise_error_messages! %>
The problem is this does not output errors the standard way that the rest of the app does:
<% flash.each do |key, value| %>
<div class="flash <%= key %>"><%= value %></div>
<% end %>
My question is, how do I get the devise error message to work like the others that use the flash.each?
Thanks.
I just want to bring a new little piece here:
So I found an easier way to get the result that "AnApprentice" wanted.
First of all, if you want to customize anything within the Devise plug-in, I highly advise you to copy past the code from "\Ruby_repertory\lib\ruby\gems\1.9.1\gems\devise-version\app\controllers|helpers|mailers..." to the file you want in your project.
[Edit] Or you can make your file inherit from the "normal" devise files... Like... say... You want to overwrite only one function within the devise/registrations_controller.rb, the first line of your Users custom registrations controller would be:
[Edit August 7th 2013] Now Devise even provides a tool to generate controllers: https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers
So... anyway... I managed to get what "AnApprentice" wanted just writing this (for a cleaner solution, see the following big edit) :
And, in my view, the next lines worked pretty well:
Well... then you can access to errors for a specific attribute like this:
And... A little trick to have only one error (the first to get catched) showing up per attribute:
I know it's been a while since this question was posted, but I think that it will help lot's of devise users :).
Big Edit:
As I love to extend my code, making it cleaner and share it with others, I recently wanted to change the devise_error_messages! method in order to use it in my views and make it display the trick I explained above.
So, here is my method:
No big deal here, I reused the code I wrote in my view to show only one error pey attribute, because often the first one is the only relevant (like when the user forgets one required field).
I'm counting those "unique" errors and I'm making a H2 HTML title using pluralize and putting it BEFORE the errors list.
So now, I can use the "devise_error_messages!" as the default one and it renders exactly what I was already rendering before.
If you want to access a specific error message in your view, I now recommend to use directly "resource.errors[:attribute].first" or whatever.
Seya, Kulgar.
I like to do it just like it's done in the other Devise controller with this cheat.
For materialisecss to display devise error messages as toast I added this code in app/helpers/devise_helper.rb
I am sure their would be cleanest way to write it but it's woking perfectly
I'm trying to figure this out myself. I just found this issue logged on Github https://github.com/plataformatec/devise/issues/issue/504/#comment_574788
Jose is saying that
devise_error_messsages!
method is just a stub (though it contains implementation) and that we're supposed to override/replace it. It would have been nice if this was pointed out somewhere in the wiki, which is why i guess there are a few people like us that have been guessing.So I'm going to try reopening the module and redefine the method, effectively overriding the default implementation. I'll let you know how it goes.
Update
Yep, that works. I created
app/helpers/devise_helper.rb
and overrode it like so:So knowing this, I can modify the method to display error messages the way I want it to.
To help you solve your original problem: Here's the original
devise_helper.rb
on Github. Take a look at how the error messages are being traversed:That should help you get started. :)
Another update
The
resource
object is actually the model that is being used by devise (go figure).It also appears to be defined in a higher scope (probably coming from the controller), so it can be accessed in a variety of places.
Anywhere in your Helper
Your View
I just declared devise_error_messages! as an empty helper. And manually fetched and handled the errors in a general _errors partial for my application. Seemed like the simplest solution and I don't have to go through all of devise's files and remove the call to the error handler.