Question

There are questions similar to this but none were able to help me. I am still learning rails and am making a basic user signup system. In the signin method of the SessionsHelper module, I use the self keyword.

module SessionsHelper
    def sign_in(user)
        remember_token = User.new_remember_token
        cookies.permanent[:remember_token] = remember_token
        user.update_attribute(:remember_token, User.encrypt(remember_token))
        self.current_user = user
    end

    def current_user=(user)
        @current_user = user
    end

    def current_user
        remember_token = User.encrypt(cookies[:remember_token])
        #@current_user ||= User.find_by_remember_token(:remember_token) #The find_by method might not work
        @current_user ||= User.where(remember_token: remember_token).first
    end

    def signed_in?
        !current_user.nil?
    end
end

I include the module in the ApplicationController class like so:

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
end

I think that means that the keyword self in the SessionsHelper module would therefore always refer to the ApplicationController class. However, shouldn't the current_user actually rrefer to the Sessions_controller? The sign_in method is also in the SessionsController and the UsersController, but based on my understanding of self, when the method is called inside these classes, it should still refer to the ApplicationController because that is where the SessionsHelper module is included. Here is the code for the UsersController:

class UsersController < ApplicationController
  def new
    @user = User.new
  end

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App"
      redirect_to @user
    else
        render 'new'
    end
  end
end

Here is the SessionsController:

 class SessionsController < ApplicationController
        def new
        end

        def create
            user = User.find_by_email(params[:session][:email].downcase)
            if user && user.authenticate(params[:session][:password])
                sign_in user
                redirect_to user
            else
                flash.now[:error] = 'Invalid email.password combination'
                render 'new'
            end
        end
 end 

Thanks to anyone who can help. I've been trying to understand this for hours.

Was it helpful?

Solution

   #...snip
   self.current_user = user
end

The self here is the class this module has been included into. So it executes the next line

def current_user=(user)
    @current_user = user
end

This stores an instance variable on the controller -- the ApplicationController. Generally, all other controller inherit from the ApplicationController, so this affects the whole system.

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