Let’s say we want a simple controller action that checks, if a given code is valid.
It should return true and false and, if the code is invalid, give the reason (whether that is because it is unknown or because it has been used already). The action could look like this:
[gist id=2235608 bump=1]
Now this deep nesting effectively hides the underlying algorithm, a simple one in this case.
Expressing this using throw
and catch
straightens the code a bit:
[gist id=2235614 bump=1]
We are down to one respond_with
line but the has merging and the throws at the beginning of the line are not particularly pretty.
Let’s introduce a little Ruby mixin for the Hash
class that provides it with a compact
method that its friend Array
has had all along:
[gist id=2235631]
Now using this to clean up the response hash and moving the throw statements to the end so the steps of the algorithm are visible we have our final version of the action:
[gist id=2235618]