Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access current_user in model

I have 3 tables

items (columns are:  name , type) history(columns are: date, username, item_id) user(username, password) 

When a user say "ABC" logs in and creates a new item, a history record gets created with the following after_create filter. How to assign this username ‘ABC’ to the username field in history table through this filter.

class Item < ActiveRecord::Base   has_many :histories   after_create :update_history   def update_history     histories.create(:date=>Time.now, username=> ?)    end end 

My login method in session_controller

def login   if request.post?     user=User.authenticate(params[:username])     if user       session[:user_id] =user.id       redirect_to( :action=>'home')       flash[:message] = "Successfully logged in "     else       flash[:notice] = "Incorrect user/password combination"       redirect_to(:action=>"login")     end   end end 

I am not using any authentication plugin. I would appreciate if someone could tell me how to achieve this without using plugin(like userstamp etc.) if possible.

like image 295
LearnRails Avatar asked Mar 25 '10 05:03

LearnRails


1 Answers

Rails 5

Declare a module

module Current   thread_mattr_accessor :user end 

Assign the current user

class ApplicationController < ActionController::Base   around_action :set_current_user   def set_current_user     Current.user = current_user     yield   ensure     # to address the thread variable leak issues in Puma/Thin webserver     Current.user = nil   end              end 

Now you can refer to the current user as Current.user

Documentation about thread_mattr_accessor

Rails 3,4

It is not a common practice to access the current_user within a model. That being said, here is a solution:

class User < ActiveRecord::Base   def self.current     Thread.current[:current_user]   end    def self.current=(usr)     Thread.current[:current_user] = usr   end end 

Set the current_user attribute in a around_filter of ApplicationController.

class ApplicationController < ActionController::Base   around_filter :set_current_user    def set_current_user     User.current = User.find_by_id(session[:user_id])     yield   ensure     # to address the thread variable leak issues in Puma/Thin webserver     User.current = nil   end              end 

Set the current_user after successful authentication:

def login   if User.current=User.authenticate(params[:username], params[:password])     session[:user_id] = User.current.id     flash[:message] = "Successfully logged in "     redirect_to( :action=>'home')   else     flash[:notice] = "Incorrect user/password combination"     redirect_to(:action=>"login")   end end 

Finally, refer to the current_user in update_history of Item.

class Item < ActiveRecord::Base   has_many :histories   after_create :update_history   def update_history     histories.create(:date=>Time.now, :username=> User.current.username)    end end 
like image 53
Harish Shetty Avatar answered Oct 08 '22 17:10

Harish Shetty