Каков оптимальный способ работы с несуществующими переменными в Rails? - PullRequest
1 голос
/ 16 марта 2011

Я работаю над приложением Rails, которое извлекает данные из API Groupon и отображает их на нашем сайте.

Возьмем следующую структуру данных, например:

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

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

Если бы я хотел просмотреть каждую сделку и показать streetAddress1, если он существует, каков оптимальный способ сделать это в Rails?

Ответы [ 3 ]

0 голосов
/ 16 марта 2011

Лучше всего использовать present?:

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

Если у вас есть массив объектов и вы хотите зацикливать только те объекты, для которых установлен атрибут, вы можете использовать select:

array.select{|object| object.attribute.present?}.each do |object|
  ...
end
0 голосов
/ 16 марта 2011

Если у вас есть глубоко вложенная структура, вы можете создать пользовательскую функцию, чтобы проверить, существует ли ключ, и отобразить его значение:

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
0 голосов
/ 16 марта 2011

Просто сделай:

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

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...