0

I followed this tutorial verbatim:

https://github.com/plataformatec/devise/wiki/How-To:-Email-only-sign-up

But when the user clicks the confirm link, it doesn't show the screen where they set a password, yet it sets them to confirmed. I have looked at the logs and it makes the request to the confirmations controller but doesn't show the view - just processes the token and redirects to logged-in root.

Started GET "/users/confirmation?confirmation_token=gs5NCZTu3hSJeWqCGDr6" for 127.0.0.1 at 2013-08-18 00:15:06 +0100
Processing by Devise::ConfirmationsController#show as HTML
  Parameters: {"confirmation_token"=>"gs5NCZTu3hSJeWqCGDr6"}
  [1m[36mUser Load (0.3ms)[0m  [1mSELECT "users".* FROM "users" WHERE "users"."confirmation_token" = 'gs5NCZTu3hSJeWqCGDr6' LIMIT 1[0m
  [1m[35m (0.1ms)[0m  BEGIN
  [1m[36m (0.5ms)[0m  [1mUPDATE "users" SET "confirmation_token" = NULL, "confirmed_at" = '2013-08-17 23:15:06.840455', "updated_at" = '2013-08-17 23:15:06.841240' WHERE "users"."id" = 4[0m
  [1m[35m (0.4ms)[0m  COMMIT
  [1m[36m (0.1ms)[0m  [1mBEGIN[0m
  [1m[35m (0.3ms)[0m  UPDATE "users" SET "last_sign_in_at" = '2013-08-17 23:15:06.843987', "current_sign_in_at" = '2013-08-17 23:15:06.843987', "last_sign_in_ip" = '127.0.0.1', "current_sign_in_ip" = '127.0.0.1', "sign_in_count" = 1, "updated_at" = '2013-08-17 23:15:06.844495' WHERE "users"."id" = 4
  [1m[36m (0.3ms)[0m  [1mCOMMIT[0m
Redirected to http://0.0.0.0:5000/

My routes (as instructed) are:

devise_for :users, :controllers => { :registrations => "registrations", :confirmations => 'confirmations' }

  devise_scope :user do
    put "/confirm" => "confirmations#confirm"
  end

And I have a show.html.erb in app/views/devise/confirmations AND in app/views/confirmations just in case as their instructions (misleadingly) state such.

I think it might have something to do with this controller they have you make:

class ConfirmationsController < Devise::ConfirmationsController
    def show
      self.resource = resource_class.find_by_confirmation_token(params[:confirmation_token]) if params[:confirmation_token].present?
      super if resource.nil? or resource.confirmed?
    end

Is it supposed to render the view here? Because the super class of this never calls show either:

def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource) if Devise.allow_insecure_sign_in_after_confirmation
      respond_with_navigational(resource){ redirect_to after_confirmation_path_for(resource_name, resource) }
    else
      respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render :new }
    end
  end

Edit: I've changed the code in my confirmations controller to purely render :action => "show" to make sure it's using my controller but it hasn't had any effect. I double checked with rake routes and it seems right yet isn't overriding it seems:

POST   /users/confirmation(.:format)     confirmations#create
                         GET    /users/confirmation/new(.:format) confirmations#new
                         GET    /users/confirmation(.:format)     confirmations#show
            confirmation PUT    /confirmation(.:format)           confirmations#confirm
Scott Fister
  • 1,213
  • 12
  • 24
  • Please show your confirmation controller. – Pierre-Louis Gottfrois Aug 17 '13 at 23:59
  • its because on clicking for confirm your are being redirected to show action instead of 'confirm', you can see in logs you pasted here. – Sachin Singh Aug 18 '13 at 00:01
  • My confirmations controller is an exact copy paste from the devise article pasted above. @SachinSingh I'm not sure what you mean, isn't it *supposed* to render the show action? I want it to render confirmations/show.html.erb for password input. – Scott Fister Aug 18 '13 at 00:09
  • you are right, put a debugger and check whether any user with that confirmation_token exists, if no then this is the reason. – Sachin Singh Aug 18 '13 at 00:13
  • The token exists when a user is signed up. Devise sets it to nil once it confirms the user though. Not sure how this is relevant to #show not rendering? – Scott Fister Aug 18 '13 at 00:18

1 Answers1

0

Wow. Dumbest mistake ever, but still something I'll post. I copied the new devise_for :users, :controllers => { :registrations => "registrations", :confirmations => 'confirmations' } across to my routes file, neglecting to remove the original devise_for :users which meant it ignored my new controllers.

Scott Fister
  • 1,213
  • 12
  • 24