最初我有<%= @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
答案 0 :(得分:3)
错误是由于对象vicinity
的实例方法@place
丢失了。
@place.vicinity
之前引发异常,因此不会执行运算符||
或方法.nil?
。
在回复您的评论时,如果您想知道方法附近是否存在,您可以使用try
方法:
klass.try(:vicinity)
它检查方法的存在并在存在时执行它,否则返回nil
如果不存在。
答案 1 :(得分:1)
来自NickGnd的回答看起来很不错,但只是想在||
比||=
更适合默认值。 ||=
也会执行变量赋值,这意味着如果@place.vicinity
返回nil,#vicinity=
(setter / mutator)也需要是@place
已知的方法。除此之外(我假设基于ERB标签,这是在视图中),您通常希望在呈现视图之前在控制器中进行变量赋值。