How to implement "business rules" in Rails?

Posted by Zabba on Stack Overflow See other posts from Stack Overflow or by Zabba
Published on 2011-02-15T13:42:07Z Indexed on 2011/02/15 15:25 UTC
Read the original article Hit count: 333

What is the way to implement "business rules" in Rails?

Let us say I have a car and want to sell it:

car = Cars.find(24)
car.sell

car.sell method will check a few things:

does current_user own the car?
    check: car.user_id == current_user.id
is the car listed for sale in the sales catalog?
    check: car.catalogs.ids.include? car.id

if all o.k. then car is marked as sold.

I was thinking of creating a class called Rules:

class Rules
    def initialize(user,car)
        @user = user
        @car = car
    end

    def can_sell_car?
        @car.user_id == @user.id && @car.catalogs.ids.include? @car.id
    end
end

And using it like this:

def Car
    def sell
        if Rules.new(current_user,self).can_sell_car
            ..sell the car...
        else
            @error_message = "Cannot sell this car"
            nil
        end
    end
end

As for getting the current_user, I was thinking of storing it in a global variable? I think that whenever a controller action is called, it's always a "fresh" call right? If so then storing the current user as a global variable should not introduce any risks..(like some other user being able to access another user's details)

Any insights are appreciated!

UPDATE

So, the global variable route is out! Thanks to PeterWong for pointing out that global variables persist!

I've now thinking of using this way:

class Rules
    def self.can_sell_car?(current_user, car)
       ......checks....
    end
end

And then calling Rules.can_sell_car?(current_user,@car) from the controller action. Any thoughts on this new way?

© Stack Overflow or respective owner

Related posts about ruby-on-rails

Related posts about ruby-on-rails-3