Access Devise's current_user in Model
How do I go about accessing Devises 'current_user' object inside of a model? I want to automatically appen开发者_StackOverflow社区d the current users id to a record when they create something. I know that I can manually set the user_id inside of the controller but I feel it would be easier/cleaner if it was handled by the model.
Essentially, this kind of logic doesn't belong in a Model, so you're best to pass current_user
in through a function in the model or on creation. This answer sums it up.
I know, I know, that's not the answer you wanted. Unfortunately, it may be cleaner looking to you, but it adds overhead to your model that you really don't want.
Many popular gems need to access the current_user
in the model such as paper_trail.
Their approach starts in the controller which captures the current_user
.
class ApplicationController
before_action :set_paper_trail_whodunnit
end
Which triggers:
def set_paper_trail_whodunnit
if ::PaperTrail.request.enabled?
::PaperTrail.request.whodunnit = user_for_paper_trail
end
end
and
def user_for_paper_trail
return unless defined?(current_user)
current_user.try(:id) || current_user
end
After the current_user.id
is saved from the controller, and an auditing action is triggered such as create.
class Widget < ActiveRecord::Base
has_paper_trail
end
Which eventually triggers the following event.
module PaperTrail
module Events
class Create < Base
def data
data = {
item: @record,
event: @record.paper_trail_event || "create",
whodunnit: PaperTrail.request.whodunnit
},
# .. more create code here
end
end
end
In summary, an approach would be the following.
- Save the
current_user
using abefore_action
in a controller - Store the
current_user
somewhere that can be accessed later in the model, inpaper_trail
's case that isPaperTrail.request.whudunnit
- Access your store inside the model
精彩评论