1
token = params[:token]
email = params[:email]
phone_number = params[:phone_number]
iso_code = params[:iso_code]

if token.nil? or email.nil? or phone_number.nil? or iso_code.nil?
  raise InvalidParameterException
end

token.strip!
email.strip!
phone_number.strip!
iso_code.strip!

#use the variables

我的 rails 项目中有很多这样的代码。您如何在 Ruby on Rails 中推广这种模式?
反射和元编程有可能吗?

4

5 回答 5

2
unless [:token, :email, :phone_number, :iso_code].-(params.keys).empty?
  raise InvalidParameterException
end
params.each{|_, v| v.strip!}

然后,就像params[:token]每次一样使用它。params也许您可以为like使用更短的变量名p

于 2012-11-19T09:26:54.663 回答
2

我认为在这种情况下不需要元编程或模式,只是常识:

[:token, :email, :phone_number, :iso_code].each do |k|
  raise InvalidParameterException if params[k].nil?    
  params[k] = params[k].strip
end

我从来没有理解过这种反模式的流行:

par_1 = params[:par_1]
...
par_n = params[:par_n]

为什么不使用params[:par_x]呢?使用在散列中分组的 params 变量通常比将它们存储到一堆局部变量中更方便。

于 2012-11-19T09:29:27.740 回答
1

您可以定义以下方法:

def verify_presence_define_var_and_strip(params, symbol_list)
  symbol_list.each do |s|
    raise InvalidParameterException if params[s].nil?
    define_method s, params[s].strip
  end
end

使用此方法,您的代码可以替换为:

verify_presence_define_var_and_strip(params, [:token, :email, :phone_number, :iso_code])

请注意,它将定义方法,而不仅仅是设置局部变量,但如果您的类中还没有具有此名称的方法,您应该得到相同的结果。

您可能更喜欢使用该instance_variable_set方法,但您必须在变量名前加上@.

[更新]

如果你真的想定义局部变量而不是方法/实例变量,我不知道使用 eval 的其他解决方案:

eval "#{s} = #{params[:s].strip}"

但是,如果您搜索一下eval,您会发现,这被认为是不好的做法,而且在这种情况下,您将评估来自 URL/POST 参数的值!

于 2012-11-19T09:16:26.417 回答
0

创建一个辅助方法来访问 params 哈希并遍历元素并检查 nil 并抛出异常本身或将值返回给可能抛出异常的调用方法。

你可以像这样迭代任何哈希,

hash.each do |key,value|
 #example nil check
  if value.nil?
    #do what you want
  end
end
于 2012-11-19T09:10:30.277 回答
0

如果你想在你的参数散列中提高 nil ,你可以这样做

raise InvalidParameterException if params.values.include? nil

如果您只想提高某些特定参数,则必须首先选择与这些键关联的值:

required_keys = [:key1, :key2, :key3]
raise invalidParameterException if required_keys.map{|k| params[k]}.include? nil

编辑:由于缺少积分而无法回答,但我相信其中一个答案不起作用:

[:some_key] - {some_key: nil}.keys   # => []

如果参数哈希包含一个用值 nil 初始化的键(由于解析失败或用户输入无效),则数组减法不起作用。

于 2012-11-19T09:27:49.573 回答