Peter Marklund's Home |
Rails Tip: Validating Option Arguments
I think it's a good convention to validate options arguments passed to methods, i.e. to make sure they have valid keys and values. Misspellings can otherwise lead to unnecessary debugging sessions. Rails comes with the assert_valid_keys method. I added the assert_value method:
#:nodoc:
#:nodoc:
#:nodoc:
# Assert that option with given key is in list
options.assert_valid_keys([:in])
if !(options[:in].map(&:to_s) + ['']).include?(self[key].to_s)
raise(ArgumentError, "Invalid value ' ' for option ' ' must be one of ' '")
end
end
end
end
end
end
Example usage and RSpec specification:
.assert_valid_keys([:billing_period])
options.assert_value(:billing_period, :in => ["annual", "monthly"])
# method logic here...
end
# Rspec:
it "cannot be invoked with an invalid option" do
lambda { @campaign.price([23], :foobar => true)
}.should raise_error(ArgumentError)
end
it "cannot be invoked with an invalid billing period" do
lambda { @campaign.price([23], :billing_period => :foobar)
}.should raise_error(ArgumentError)
end
options