Hash Tricks
class Hash # lets through the keys in the argument # >> {:one => 1, :two => 2, :three => 3}.pass(:one) # => {:one=>1} def pass(*keys) tmp = self.clone tmp.delete_if {|k,v| ! keys.include?(k) } tmp end # blocks the keys in the arguments # >> {:one => 1, :two => 2, :three => 3}.block(:one) # => {:two=>2, :three=>3} def block(*keys) tmp = self.clone tmp.delete_if {|k,v| keys.include?(k) } tmp end end
In case you don’t already see the utility of this:
def some_action # some script kiddie also passed in :bee, which we don't want tampered with _here_. @model = Model.create(params.pass(:foo, :bar)) end
or those cases where you don’t want to let everything through and don’t want to resort to attr_protected or attr_accessible