Blog post -

The "returning" method explained

This one you will find all over the Rails code. The "returning" trick is a really neat way to refactor ugly patterns, such as this one:


object = []
object << "foo" if bar?
object


Into this:

returning [] do |object|
object << "foo" if bar?
end


So what returning does is, it creates an object using the first parameter (a new array in the above example), yeilding it to the block passed, and returns it when done. It all becomes clear in this example:

def Post.update_record(post_id)
  post = find(post_id)
  post.update_attribute(:foo, "bar")
  post
end


That ugly (well...) method finds an object, updates an attribute and saves it. But because the "save" method called by "update_attribute" just returns true or false, you will need to explicitly return the post object last in the method if you want to get it back. The returning approach just feels better for me:

def Post.update_record(post_id)
  returning find(post_id) do |post|
    post.update_attribute(:foo, "bar")
  end
end


Same lines of code in this primitive example, but it will make you look like a better Rails programmer. Here is the method in all its simple glory:

Class object
  def returning(value)
    yield(value)
    value
  end
end

Categories

  • tip
  • ruby on rails