默认值不适用于Ruby On Rails

时间:2015-12-14 12:31:56

标签: ruby-on-rails ruby ruby-on-rails-4

最初我有<%= @place.vicinity ||= @place.location.display_address[0] %>但是它犯了错误

  

未定义的方法`附近'为&lt;   BurstStruct ::突发:0x00000006126ff0&GT;

我也尝试过只有||@place.vicinity.present?,但同样的错误。当我回复@place.location.display_address[0]时,它就出现了。所以我认为这可能是由于班级中vicinity成员没有出现错误(尽管我已经使用nil?运算符对其进行了测试)然后我尝试了下面的ternary oprator仍然是同样的错误:/
    <%= @place.vicinity.nil? ? @place.location.display_address[0] :@place.vicinity %> 任何帮助和建议将不胜感激

更新
我在做什么,当我打电话给yelp它返回我的位置,当我打电话给谷歌我返回“附近” - 所以没有班级

控制器

def index
  phone_number =params["phone_number"]
  if params["provider"] == 'GOOGLE'
    client = GooglePlaces::Client.new("Qf4D-GJpap09o")
    @place =  client.spot(params["place_id"])  
  elsif params["provider"] == 'yelp'
    yelp_client = Yelp::client 
    @place = yelp_client.business(params["place_id"])   
  end
end

2 个答案:

答案 0 :(得分:3)

错误是由于对象vicinity的实例方法@place丢失了。

@place.vicinity之前引发异常,因此不会执行运算符||或方法.nil?

在回复您的评论时,如果您想知道方法附近是否存在,您可以使用try方法:

klass.try(:vicinity)

它检查方法的存在并在存在时执行它,否则返回nil如果不存在。

参考文献: http://apidock.com/rails/Object/try

答案 1 :(得分:1)

来自NickGnd的回答看起来很不错,但只是想在||||=更适合默认值。 ||=也会执行变量赋值,这意味着如果@place.vicinity返回nil,#vicinity=(setter / mutator)也需要是@place已知的方法。除此之外(我假设基于ERB标签,这是在视图中),您通常希望在呈现视图之前在控制器中进行变量赋值。