我在写一个应用程序,根据距离把孩子送到幼儿园。
我正在尝试使用Maps API计算多个地址之间的距离。我想使用open-uri
https://maps.googleapis.com/maps/api/distancematrix/json?origins=[address of child]&destinations=[adress of kindergarden]&key=XYZ
这将是对API的请求。
我的想法是在孩子的创建过程之后发送请求,我将从数据库中获取孩子的地址和幼儿园的地址,然后构建请求。
响应的距离将被保存在每个孩子和幼儿园的关系表中。我如何访问孩子和幼儿园的数据库条目?然后将其保存到关系表中?
我当前的代码如下所示:
def create
@child = Child.new child_params
@child.user = current_user
@child.save
origin = @child.adress
destination = @kiga.adress
response = open('https://maps.googleapis.com/maps/api/distancematrix/json?origins=' + [address of child] + '&destinations=' + [adress of kindergarden] + '&key=XYZ').read
relations.distance = response.rows.elements[0]
respond_to do |format|
if @child.save
format.html { redirect_to @child, notice: 'Child was successfully created.' }
format.json { render :show, status: :created, location: @child }
else
format.html { render :new }
format.json { render json: @child.errors, status: :unprocessable_entity }
end
end
帮忙会很感激吗?
2条答案
按热度按时间r1wp621o1#
这里的问题是,您试图将URL作为字符串打开,因此它正在查找以这种方式命名的文件,但该文件不存在。
您有两个选择:
1.使用HTTParty gem发出HTTP请求
这是我最喜欢的方法。
将gem包含在
Gemfile
中:在控制器中发出请求:
现在,如果您要打印
response["rows"].first["elements"].first
的结果,您将看到如下输出:正如你所看到的,你有距离和持续时间信息。我猜你是在距离值米后,所以:
注1:我故意复制了单词address(@child. address,@kiga. address)中的拼写错误,以便代码可以与您的设置一起工作,但给予考虑将其修复为@child.address和@ kiga. address.
注2:为了简单起见,我没有对响应进行任何错误检查,这是您绝对应该注意的事情。
注3:记得将API键更改为有效的,为了简单起见,我将其硬编码为XYZ,就像您在问题中所做的那样。
2.使用open-uri将url解析为有效的URI
您必须在控制器的开头使用库
'open-uri'
和'JSON'
:变量
result
的内容(解析后)如下所示:无论你选择HTTParty方式还是open-uri + JSON解析方式,都要确保检查响应状态码,这两种方式都已经在我的计算机上进行了本地测试,结果都很成功。
希望有帮助,干杯!
k5ifujac2#
另一种解决方案是查看Gem https://github.com/alexreisner/geocoder
如果您对子模型和Kiga模型进行地理编码,那么您可以轻松获得从一个模型到另一个模型的距离。
这不需要进行任何API调用,GEM会为您完成此操作。
它也有一个非常方便的方法来返回某个位置附近的记录
将返回所有Kiga,并带有10公里的@child坐标