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.
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With