How to create a current user method without using any gem or plugin?

I know this is stupid, but I want to know how we can create the current_user method to access the entire application without using any gem or plugin? To test it, I created an application that allows the user to share files and folders. How to create a method in which the user can access only his folder and files? Here is my sample code:

Input controller:

class LoginController < ApplicationController layout 'signup' #to skip checking the authentication and authorization. skip_before_filter :check_authentication, :check_authorization def index end def authenticate if request.post? user = User.authenticate(params[:username],params[:password]) if user session[:current_user_id]=user.id session[:name]= user.first_name puts "session name #{session[:name]}" redirect_to(:subdomain => user.company.subdomain, :controller => :dashboard) else flash.now[:notice] = "Invalid user/password combination" end end end def destroy session[:current_user_id] = nil reset_session flash[:notice] = "You have been successfully logged out." redirect_to root_url end end 

User Model:

 require 'digest/sha1' class User < ActiveRecord::Base #sharering method start after_create :check_and_assign_shared_ids_to_shared_folders #this is to make sure the new user ,of which the email addresses already used to share folders by others, to have access to those folders def check_and_assign_shared_ids_to_shared_folders #First checking if the new user email exists in any of ShareFolder records shared_folders_with_same_email = SharedFolder.find_all_by_shared_email(self.email) if shared_folders_with_same_email #loop and update the shared user id with this new user id shared_folders_with_same_email.each do |shared_folder| shared_folder.shared_user_id = self.id shared_folder.save end end end #to check if a user has acess to this specific folder def has_share_access?(folder) #has share access if the folder is one of one of his own return true if self.folders.include?(folder) #has share access if the folder is one of the shared_folders_by_others return true if self.shared_folders_by_others.include?(folder) #for checking sub folders under one of the being_shared_folders return_value = false folder.ancestors.each do |ancestor_folder| return_value = self.being_shared_folders.include?(ancestor_folder) if return_value #if it true return true end end return false end #sharing method end def self.authenticate(name, password) user = self.find_by_username(name) if user expected_password = encrypt_password(password, user.salt) if user.hashed_password != expected_password user = nil end end user end #'password' is a virtual attribute def password @password end def password= (pwd) @password =pwd return if pwd.blank? create_new_salt self.hashed_password = User.encrypt_password( self.password, self.salt) end def self.users_in_company(user_id) User.find(user_id).company.users end private def password_non_blank errors.add(:password, "Missing password, please enter your password") if hashed_password.blank? end def create_new_salt self.salt = self.object_id.to_s + rand.to_s end def self.encrypt_password(password, salt) string_to_hash = password +"prftnxt" + salt Digest::SHA1.hexdigest(string_to_hash) end end 

I want to access all files as "current_user.files", is this possible without any gem?

Application Helper:

 module ApplicationHelper #for current user to use through out the app def current_user @current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) # Use find_by_id to get nil instead of an error if user doesn't exist end end 

Application controller:

 class ApplicationController < ActionController::Base include UrlHelper #include ApplicationHelper helper_method :current_user #make this method available in views protect_from_forgery # def current_user # @current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) # Use find_by_id to get nil instead of an error if user doesn't exist # end end 

and in the task controller:

 class TasksController < ApplicationController # GET /tasks # GET /tasks.xml def index @menu = "Timesheet" @page_name = "Manage Task" company_id = Company.find_by_subdomain(request.subdomain) @users = User.find_all_by_company_id(company_id) @tasks = current_user.tasks.all#Task.all @task = Task.new respond_to do |format| format.html # index.html.erb format.html # new.html.erb format.xml { render :xml => @tasks } end end end 

and my error message I received:

 NameError in TasksController#index undefined local variable or method `current_user' for #<TasksController:0xfa7e638> 
+4
source share
2 answers
Hi friends. I found a way to create the current_user method without using any gem or plugin:

In my application_helper.rb I did this:

 module ApplicationHelper def current_user User.find(session[:current_user_id]) end end 

and at the end in my application controller.rb I called it because from here I can access it through the application:

 class ApplicationController < ActionController::Base include UrlHelper include ApplicationHelper helper_method :current_user end 

and now I can access any data related to current user :

like:

@tasks = current_user.tasks

Thanks to all my friends for their valuable answers.

+4
source

which is not so difficult;) just define the method you need:

 class ApplicationController < ... def current_user @current_user ||= session[:current_user_id] && User.find_by_id(session[:current_user_id]) # Use find_by_id to get nil instead of an error if user doesn't exist end helper_method :current_user #make this method available in views end 
+9
source

Source: https://habr.com/ru/post/1383025/


All Articles