有没有更多的rubylike方式来做这个辅助函数

时间:2012-02-04 16:40:52

标签: ruby-on-rails ruby

def work_location(application)
  if application.contact.work_location.blank? rescue nil
    return false
  else
    return true
  end
  return false
end

基本上我想返回true或false ....如果work_location不为空,我只想返回true并且我需要捕获nil错误

实际上会产生语法错误

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

3 个答案:

答案 0 :(得分:3)

def work_location(application)
  application.try(:contact).try(:work_location).present?
end

我个人不喜欢通过rescue false处理潜在的nils,因为你捕获的内容远远超过nils:这样的救援会拯救各种其他错误,例如它会捕获NoMethodError,所以如果你键入其中一个方法名称,它会压缩该错误并使其更难以追踪。

答案 1 :(得分:0)

  1. 编写测试并检查真假返回案例
  2. 使用以下内容缩短上面的代码:
  3. def work_location(application)
      application.contact.work_location.blank? rescue true
    end

答案 2 :(得分:0)

据我所知,你在这里创建一个帮助方法。 我应该在应用程序上定义一个方法,然后您可以在视图中使用它。

优点:它纯粹是面向对象的。申请人应该知道它是否有工作场所。

其次,使用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?可以工作并返回falso,因此您可以编写

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

注意:因为我们正在向应用程序添加方法,所以我们可以安全地假设application,因此我们只需检查contact是否已存在。

在您的观点中,您可以写下:

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

或类似的东西。希望这会有所帮助。