我尝试在Rails之外进行一些参数验证。
def create_statement(action, ...)
valid_one_of(action, ['ADD', 'MOVE', 'DELETE'])
...
end
验证方法:
def valid_one_of(input, valid_values)
return true if valid_values.include?(input)
raise "#{input} was not a valid value for #{input.var_name}"
end
示例电话:
create_statement('Bob')
所以输出结果为:
Bob was not valid value for action
问题我如何获得 input.var_name ?
我可以传递
的解决方法valid_one_of(action, ['ADD', 'MOVE', 'DELETE'], 'action')
(并使用第三个parm作为我的输出),但这似乎并不是多余的。
如果无法访问变量名,那么DRY编码风格是否比此变通方法更多?
答案 0 :(得分:0)
我不知道如何获取局部变量的名称,即使你可以,你想要哪个名字?方法定义中定义的参数名称?调用者中变量的名称?
我不认为你的“解决方案”是那么可怕,但我可以提出一些可能会稍微好一点的微小变化。
此外,我不确定您的意图是否实际传入呼叫站点上的有效值列表,或者如果您可能有,请说一个有效值的哈希,您可以使用传入的类型来查找有效值来自。
def valid_one_of_type type, input:, valid_values:
return true if valid_values.include?(input)
raise "#{input} was not a valid value for #{type}"
end
my_action = "bob"
valid_one_of_type :action , input: my_action, valid_values: ['ADD', 'MOVE', 'DELETE']
def valid_one_of_type type, input, valid_values
return true if valid_values.include?(input)
raise "#{input} was not a valid value for #{type}"
end
my_action = "bob"
valid_one_of_type :action , my_action, ['ADD', 'MOVE', 'DELETE']
另一个选择是将您的操作包装在一个类中并在创建时进行验证:
class Action
VALID_ACTIONS = ['ADD', 'MOVE', 'DELETE']
def initialize action
unless VALID_ACTIONS.include? action
raise "#{action} is not a valid value for #{self.class.name}"
end
end
end
my_action = Action.new "bob"