如何检查对象是否退出视图ROR

时间:2015-06-24 09:38:28

标签: ruby-on-rails ruby if-statement

我在远程lat long上实现了查询,并在查询中创建了虚拟字段

user        = User.all
if longitude.present? && latitude.present? && fulladdress.present?

   distantQuery = "(3959 * acos( cos( radians("+latitude+") ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians("+longitude+")) + sin( radians("+latitude +")) * sin(radians(latitude))))  < " + miles
   user = User.select("*, (3959 * acos(cos(radians("+latitude+")) * cos( radians(latitude)) * cos(radians(longitude) - radians("+longitude+")) + sin(radians(" +latitude +")) * sin(radians(latitude))))  as distant").where(distantQuery)
end

当我的if条件运行时,遥远的其他方面将会出现

<% @result.each do |r| %>
<tr>
<td>
 <%= r.distant.present %>

</td>
</tr>

现在在视图中我的遥远是来自形式查询然后它将显示结果,当它不会来时它会显示我错误

undefined method `distant' for #<User:0x000000092a6558>

我在视图中实现了“礼物”

  <% if r.distant.present? %>
                        <%= r.distant.to_i %>   


                <% end %>

但它仍然显示我的错误,我会用什么来检查遥远的是否会出现然后它会显示而其他明智的不是?

3 个答案:

答案 0 :(得分:5)

这应该有效:

 <% if r.respond_to?(:distant) %>

但是视图中的逻辑太多了,我建议您重构一些代码,以便在视图中使用非常简单和安全的方法

答案 1 :(得分:1)

试试这个

<%= r.try(:distant) %>

答案 2 :(得分:0)

我会用另一种方法:

user =  if longitude.present? && latitude.present? && fulladdress.present?
          distantQuery = QUERY_BODY_HERE
          User.select(SELECT_QUERY_HERE).where(distantQuery)
        else
          User.all
        end

unless user.respond_to(:distant)
  class << user
    def distant ; nil ; end
  end
end

此方法的优势在于您拥有一致的User类,无论是否已计算,都能正确回复#distant