我正在Ruby on Rails中开发一个API mashup,并试图根据hash标签从twitter获取推文。获取后我试图在谷歌地图上显示它们。我正在使用Gmaps4rails,Geocoder,Twitter宝石。 为了识别用户的位置,我使用推文中的位置字段并对其进行地理编码。
问题是我没有得到坐标。到目前为止,我可以根据哈希标签及其位置来获取推文。当我尝试对位置进行地理编码并在数组中创建坐标时,我得到了一个nil类异常。
搜索标签的代码
def search(hashtag)
client = Twitter::REST::Client.new do |config|
config.consumer_key = Rails.application.config.twitter_key
config.consumer_secret = Rails.application.config.twitter_secret
config.access_token = oauth_token
config.access_token_secret = oauth_secret
end
geoloc="53.349740,-6.256845,500mi"
tweets = client.search(hashtag,{:geocode => geoloc ,:lang => "en" , :count => 15})
return tweets
端
对于地理编码,我在控制器
中尝试了这些变化def search
@tweets=current_user.search(tweet_params[:hashtag])
@tweets.each do |tweet|
@tweet["latlang"] = Geocoder.search(tweet.user.location).coordinates
end
end
def search
@tweets=current_user.search(tweet_params[:hashtag])
@tweets.each do |tweet|
@loc<<
{
:lat => Geocoder.search(tweet.user.location.to_s).first.coordinates.first,
:lng => Geocoder.search(tweet.user.location.to_s).first.coordinates.last
}
end
end
def search
@tweets=current_user.search(tweet_params[:hashtag])
@tweets.each do |tweet|
if(tweet.user.location.present?)
@loc<<
{
:lat => Geocoder.search(tweet.user.location.to_s).first.coordinates.first,
:lng => Geocoder.search(tweet.user.location.to_s).first.coordinates.last
}
else
continue
end
end
end
或者我可以创建一个新数组,我可以在其中推送所有值
@location<<
{
:latlng => Geocoder.search(tweet.user.location).coordinates
}
我收到的错误如“未定义的方法”&lt;&lt;&lt;为零:NilClass“
谢谢
答案 0 :(得分:0)
我在 Syed Aslam
的帮助下找到了解决方案获取NilClass异常的问题是通用的,因为我在使用之前没有定义数组。
控制器代码
def search
@tweets=current_user.search(tweet_params[:hashtag])
@loc=[]
@tweets.each do |tweet|
if(tweet.user.location.present?)
@loc<<
{
:lat => Geocoder.search(tweet.user.location.to_s).first.coordinates.first,
:lng => Geocoder.search(tweet.user.location.to_s).first.coordinates.last
}
else
end
end
end
查看代码
<h2><%= @loc.to_json %></h2>
添加标记的脚本
</div>
<script type="text/javascript">
handler = Gmaps.build('Google');
handler.buildMap({ provider: {}, internal: {id: 'map'}}, function(){
markers = handler.addMarkers(<%=raw @loc.to_json %>);
handler.bounds.extendWith(markers);
handler.fitMapToBounds();
});
</script>