在Rails中处理不存在的变量的最佳方法是什么?

时间:2011-03-16 16:53:32

标签: ruby-on-rails

我正在开发一个Rails应用程序,该应用程序从Groupon的API中提取数据并将其显示在我们的网站上。

采用以下数据结构,例如:

---
- "id": deal one
  "options": 
    "redemptionLocations": 
    - "streetAddress1": 123 Any Street"

- "id": deal two
  "options": []

如果我想遍历每笔交易,并显示streetAddress1(如果存在),那么在Rails中执行此操作的最佳方式是什么?

3 个答案:

答案 0 :(得分:0)

只是做:

if(defined? streetAddress1) then
    print streetAddress1 + " is set"
end

希望有所帮助

答案 1 :(得分:0)

最佳做法应该是使用present?

puts "It is #{object.attribute}" if object.attribute.present?

如果您有一个对象数组,并且只想对那些具有属性集的对象进行循环,则可以使用select

array.select{|object| object.attribute.present?}.each do |object|
  ...
end

答案 2 :(得分:0)

如果你有一个深层嵌套的结构,你可以创建一个自定义函数来检查一个键是否存在并显示其值:

def nested_value hash, *args
  tmp = hash
  args.each do |arg|
    return nil if tmp.nil? || !tmp.respond_to?(:[]) || (tmp.is_a?(Array) && !arg.is_a?(Integer))
    tmp = tmp[arg]
  end
  tmp
end

例如,如果您从示例中加载了以下YAML:

k = [
  { "id"=>"deal one",
    "options"=>{"redemptionLocations"=>[{"streetAddress1"=>"123 Any Street\""}]}},
  { "id"=>"deal two",
    "options"=>[]}]

然后你可以这样做:

nested_value k.first, 'options', 'redemptionLocations', 0, 'streetAddress1'
=> "123 Any Street \""
nested_value k.last, 'options', 'redemptionLocations', 0, 'streetAddress1'
=> nil