Separation of concerns and more

Say you have an app not dissimilar to StackOverflow where users vote on
posts. Say an Up Vote causes the voter to receive one reputation point.
You
might see something like this in the vote_up model:

class UpVote < ActiveRecord::Base
belongs_to :user
after_create :increase_user_reputation

private

def increase_user_reputation
user = self.user
user.reputation == user.reputation + 1
end
end

There is one issue with this code: The value 1 is hard coded. Where does
such a value belong? Another issue is that some UpVote should have no
knowledge of user.reputation. We solve this by changing the callback:

def increase_user_reputation
self.user.modify_reputation(1)
end

Then we add an instance method to User:

def modify_reputation(reputation)
self.reputation = self.reputation + reputation
self.save!
end

Questions…

  1. Who’s responsible for calling save! ? The
    increase_user_reputationinside the UpVote model or the
    modify_reputation method inside the user model?
  2. The +1 one to reputation doesn’t seem like a good idea to hard code.
    Where does Rails keep such configuration settings?
  3. Does the code look reasonable? Are there any shortcuts?

Just a bump!

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs