0

我的代码在控制台中运行,但在 App 中运行

➜  Meet-and-Eat git:(master) ✗ rails c
Running via Spring preloader in process 15789
Loading development environment (Rails 5.2.2)
2.5.3 :001 > i = ["10 Palmerston Street", "DERBY"]
 => ["10 Palmerston Street", "DERBY"]
2.5.3 :002 > result = Geocoder.search("#{i[0]}, #{i[1]}").first.coordinates
 => [52.9063415, -1.4937474]

我的代码:

<% @places = [] %>
<% @placesCoordinations = [] %>

<% @information.each do |i| %>
  <% @places.push([i.address1, i.town, i.postcode, information_path(i)]) %>
<% end %>

<% @places.each do |i| %>
  <% result = Geocoder.search("#{i[0]}, #{i[1]}").first.coordinates %>
  <% @placesCoordinations.push(result) %>
<% end %>

错误 :

NoMethodError in Information#full_map_adresses.

Showing /Users/mateuszstacel/Desktop/Meet-and-Eat/app/views/information/full_map_adresses.html.erb where line #10 raised:

undefined method `coordinates' for nil:NilClass
<% @places.each do |i| %>
  <% result = Geocoder.search("#{i[0]}, #{i[1]}").first.coordinates%> //this line is breaking my app
  <% @placesCoordinations.push(result) %>
<% end %>

但是,如果我只使用一个有效的位置或邮政编码或街道地址,但我需要同时使用它们以提高精度。

<% @places = [] %>
<% @placesCoordinations = [] %>

<% @information.each do |i| %>
  <%  @places.push([i.address1, i.town, i.postcode, information_path(i)]) %>
<% end %>

<% @places.each do |i| %>
  <% result = Geocoder.search("#{i[2]}").first.coordinates %>
  <% @placesCoordinations.push(result) %>
<% end %>
4

2 回答 2

0

nil的错误消息undefined method坐标':NilClass indicates that theGeocoder.search("#{i[0]}, #{i[1]}") itself is successful, butGeocoder.search("#{i[0]}, #{i[1] }").first simply returnsnil`。

您的数组似乎@information至少包含一个无法解析的地址。可能有很多原因:地址可能只是拼写错误,或者它是一个非常小的村庄或您使用的服务不支持的国家/地区的地址。

调试提示:更改您的代码以显示它传递给方法的内容以及是否有任何结果。这样的事情可能会有所帮助:

<% @places.each do |i| %>
  Address string: <%= "#{i[0]}, #{i[1]}" %>
  <% result = Geocoder.search("#{i[0]}, #{i[1]}").first %>
  Result: <%= result.present? %>
  <% @placesCoordinations.push(result.coordinates) if result.present? %>
<% end %>

此外:我建议将这样的代码移动到模型、控制器或助手中。感觉这不属于 ERB 视图。

于 2019-02-08T11:47:58.173 回答
0

终于成功了!

模型内部:

class Information < ApplicationRecord
  geocoded_by :address
  after_validation :geocode

  def address
    [address1, address2, town, postcode].compact.join(", ")
  end
end

然后在终端运行命令:

rake geocode:all CLASS=Information SLEEP=0.25 BATCH=100

于 2019-02-08T13:57:45.037 回答