Midnightly Coder
Midnightly Coder

Reputation: 1053

Devise: "def create" in users_controller.rb not working?

I've been pulling my hair out trying to get anything working with "def create" and "def update" in the users_controller.rb for Devise.

For instance, I've tried this:

  def create

    @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      flash[:notice] = "Test Save"
    else
      flash[:notice] = "Test Error"
    end
  end

  end

I've used this code along with the appropriate code to show flash notices in the views section. However nothing is shown when I either submit a blank form, an incomplete form, or a complete form. The user registration will still go through on a complete form, but it does not follow anything I put in "def create". I've tried other ways of testing this aside from flash notices, such as sending to a different page, etc. I get no response. The same thing for "def update", it doesn't seem to even use that code.

I'm completely dumbfounded on this one, any ideas?

Upvotes: 0

Views: 283

Answers (2)

montrealmike
montrealmike

Reputation: 11641

If i understand your question correctly, you should be overwriting the devise controller.

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end

  def create
    # add custom create logic here
  end

  def update
    super
  end
end 

You can see what the default devise controllers are doing here: https://github.com/plataformatec/devise/tree/master/app/controllers/devise

If you just want to edit the flash message, looking at the link above shows that devise uses a method called set_flash_message

  # Sets the flash message with :key, using I18n. By default you are able
  # to setup your messages using specific resource scope, and if no one is
  # found we look to default scope.
  # Example (i18n locale file):
  #
  #   en:
  #     devise:
  #       registrations:
  #         signed_up: 'Welcome! You have signed up successfully.'

So you can just edit your devise.en.yml file with the correct text and voila!

Note: If you do overwrite the controller don't forget to also add

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}

Upvotes: 1

Leonel Gal&#225;n
Leonel Gal&#225;n

Reputation: 7167

How about this instead?

if @user.save
  redirect_to @user, notice: 'User was successfully created.'
else
  render action: 'new'
end

You are setting the flash, but no redirection and no rendering. I'm wondering if you are getting a blank page, or a 200 with no body.

This will redirect to the show action, setting a flash notice if successful and render the new form with the @user.errors showing why it failed.

If you are using devise, you could use the Registrations Controller to create a new account, you shouldn't need to create a new one. If you create a new one, there might be a conflict in the routes with registrations#create and users#create both pointing to POST /users

Upvotes: 0

Related Questions