Есть ли более рубиноподобный способ сделать эту вспомогательную функцию - PullRequest
0 голосов
/ 04 февраля 2012
def work_location(application)
  if application.contact.work_location.blank? rescue nil
    return false
  else
    return true
  end
  return false
end

По сути, я хочу вернуть true или false .... Я хочу вернуть true, только если work_location не пустое и мне нужно отловить ошибку nil

На самом деле это приводит к синтаксической ошибке

syntax error, unexpected modifier_rescue, expecting keyword_then or ';' or '\n'
 ..._location.blank? rescue nil

Ответы [ 3 ]

3 голосов
/ 04 февраля 2012
def work_location(application)
  application.try(:contact).try(:work_location).present?
end

Лично мне не нравится обрабатывать потенциальные нули, выполняя rescue false, потому что вы ловите гораздо больше, чем ниль: такое спасение спасает все виды других ошибок, например, оно будет ловить NoMethodError, так что если вы набралиодно из названий методов приведет к устранению этой ошибки и усложнит отслеживание.

0 голосов
/ 08 февраля 2012

Насколько я могу судить, вы создаете здесь вспомогательный метод. Я должен определить метод приложения, который вы затем сможете использовать в своих представлениях.

Преимущество: оно чисто объектно-ориентированное. Приложение должно знать, есть ли у него рабочее место или нет.

Во-вторых, используйте try : он будет пытаться использовать данный метод или блок только в том случае, если получатель не равен nil, иначе он возвращает nil.

Итак:

class Application

  def has_work_location?
    self.contact.try { |c| c.work_location.present? }
  end

end

Обратите внимание, что это использование try работает только в rails 3.2, если вы используете более старую версию, она не принимает блок. Кроме того, nil.present? работает и возвращает false, поэтому вы можете написать

  def has_work_location?
    self.contact.try(:work_location).present?
  end

Примечание: поскольку мы добавляем метод в приложение, мы можем смело предполагать application, поэтому нам нужно только проверить, что contact существует больше.

Затем вы можете написать:

<%= @application.contact.workplace if @application.has_work_place? %>

или что-то подобное. Надеюсь, это поможет.

0 голосов
/ 04 февраля 2012
  1. Написание тестов и проверка истинных и ложных возвращаемых случаев
  2. Сократите код выше с помощью:
def work_location(application)
  application.contact.work_location.blank? rescue true
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...