开发者

How to access Warden current user in business logic in Rails3

I am using Rails War开发者_如何学Goden plugin. It defines a helper method 'user' that returns current user. See the link for the source code.

Now I have an business logic object that does not have any reference to the controller. But I would like to get the current user. Is there any way of accessing this?

I have tried

ActionController::Base.helpers.user

or even

RailsWarden::Mixins::HelperMethods.user

with no luck. Thanks.


Now I have an business logic object that does not have any reference to the controller. But I would like to get the current user. Is there any way of accessing this?

So why can't you just pass the current user to those methods?

Additionally you can mix them in.

I strongly discourage you to write the static helpers (it is not Java, it is Ruby!). Instead, where you need those helpers include them as a module:

module SuperLogic
 def calculate_stuff(current_user=nil)
  (current_user || user || self).bills.sum
 end
edn

Then include this where you need it:

# user model
class User
  include SuperLogic
  #it will get the `calculate_stuff` method
end

# controller
include SuperLogic
# so you can use it as one of
calculate_stuff user
calculate_stuff

and so on...

additionally where you access your business logic, you can just create an instance of the class instead of "static" methods (in ruby they are "class" methods):

# controller
def calculate
  @result = BusinessLogic.new(user).calculate_stuff
end

This is probably the easiest thing you can do.

Really, you don't need to access whole HTTP context in your business objects (I'm not even talking about testing it).


The way I think of business logic, it's something that sits between the controller and the model. I think it would be ok to pass an instance of the request to the logic methods, and since you're using warden, you can get the user from 'request.env['warden'].user'.

I haven't encountered a good reason not to have logic methods be static (self.) methods of a module. Maybe Dmytrii's suggestion works for you, but I prefer to 'require' than to dynamically include one-off logic bits.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜