Richlewis
Richlewis

Reputation: 15374

Devise error messages missing after custom redirect

I have a custom redirects in place for my devise sign up forms, I have two forms, one for an individual and another for a company. I have added this in the create action of the registrations controller:

if resource.company_form
    redirect_to new_user_registration_path(company: true)    
  else  
    redirect_to new_user_registration_path
  end

In doing this though I have lost all the devise error messages, as in the don't display any validation errors, so I need to send the error messages along with the redirect, don't I? However, I am not sure how.

So far I have tried printing the error messages to the console:

ap(resource.errors.full_messages)

[
 [0] "Email can't be blank",
 [1] "Password can't be blank",
 [2] "Company name can't be blank"
]

Whereas this:

ap(resource.errors)

@messages={:email=>["can't be blank"], :password=>["can't be blank"], :company_name=>["can't be blank"]}

How would I get the error messages to be displayed above the form again?

Upvotes: 1

Views: 577

Answers (2)

Elias Glyptis
Elias Glyptis

Reputation: 530

Not sure if this will help, but you can customize this even further with your messages. First things first it's a good idea to actually ensure this works first. Then customize it further.

  1. Add your toastr gem to your gemfile.

gem 'toastr-rails', '~> 1.0'

  1. In your application.js you will need to add //= require toastr

  2. In your stylesheet.scss you will need to import toastr @import "toastr";

  3. Then run bundle in your terminal

In your views/devise/registrations/ folder and views/devise/password/ folder, the pages inside are your devise views that show the error messages. There you will find the error messages by devise. <%= devise_error_messages! %>

So what you wanna do, is customize these messages.

Now go to views/shared and create a new file and name it _devisemes.html.erb

<% unless resource.errors.empty? %>
  <script type="text/javascript">
   <% resource.errors.full_messages.each do |value| %>
     toastr.error('<%= value %>')
   <% end %>
  </script>
<% end %>

After you have saved this file. Just go to the following files and find

<%= devise_error_messages! %>

Replace it with <%= render 'shared/devisemes' %> in the following files below:

views/devise/registrations/edit.html.erb

views/devise/registrations/new.html.erb

views/devise/password/new.html.erb

views/devise/password/edit.html.erb

Now logout and go to create an account and without an email, or password and test it. You will notice all the error messages from devise showing up with toastr.

Upvotes: 0

knotito
knotito

Reputation: 1392

The magic of devise error messages is made with respond_with method.

Hence you can change the redirect_to for a respond_with block

respond_with(resource) do |format|
  if resource.company_form
    format.html { render 'new', locals: { is_organisation: true } }
  else  
    format.html { render 'new' }
  end
end

and in your view

<% params[:organisation] ||= is_organisation -%>

Upvotes: 1

Related Questions