Question

I am using Clearance 1.1.0 gem with Ruby on Rails 4.0.1. I am trying to override the sessions controller to provide my own custom method. I have not been able to successfully get rails to use my controller.

/app/controllers/sessions_controller.rb

class SessionsController < Clearance::SessionsController
  private

    def flash_failure_after_create
      flash.now[:notice] = translate(:bad_email_or_password,
        :scope => [:clearance, :controllers, :sessions],
        :default => t('flashes.failure_after_create', :new_password_path => new_password_path).html_safe)
    end
end

I have tried a few different things inside my routes.rb file, and have been unsuccessful. I want to change the route sign_in.

get '/sign_in' => 'sessions#new', :as => 'sign_in'

Yields the following error.

You may have defined two routes with the same name using the :as option, or you may be overriding a route already defined by a resource with the same naming.

Any ideas? Thank you!

Edit: I made a mistake. I actually need sessions#create to use my controller. I'm trying to pass a different variable to the yaml file for the flash when the session login fails.

Edit 2: I the appropriate session#create line to to my routes. In my session controller, I copied and edited for testing the flash_failure_after_create method. It is not being called. So I then copy the create method over. Now, my create method is being called, but not my flash_failure_after_create method. To get it to be called, I had to have the create method copied from gem, and changed status.failure_message to directly call the flash_failure_after_create method. Is this some sort of bug with clearance?

routes.rb

post 'session' => 'sessions#create', :as => nil

sessions_controller.rb

class SessionsController < Clearance::SessionsController
  def create
    @user = authenticate(params)

    sign_in(@user) do |status|
      if status.success?
        redirect_back_or url_after_create
      else
        #flash.now.notice = status.failure_message
        flash.now.notice = flash_failure_after_create
        render :template => 'sessions/new', :status => :unauthorized
      end
    end
  end

  private

    def flash_failure_after_create
      # Changed flash for easy testing
      flash.now[:notice] = 'Ballz.'
      #flash.now[:notice] = translate(:bad_email_or_password,
      #  :scope => [:clearance, :controllers, :sessions],
      #  :default => t('flashes.failure_after_create', :sign_up_path => sign_up_path).html_safe)
    end
end

No correct solution

OTHER TIPS

I believe this will work:

get '/sign_in' => 'sessions#new', :as => nil

Rails 4 no longer supports overriding route names, so don't name your override. The mapping is still the same so sign_in_path should still work.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top