Rails应用跳转谷歌地图外部URL传递参数失效问题排查
解决Rails中重定向谷歌地图路线URL参数失效的问题
我帮你排查出两个核心问题,直接对应你遇到的参数失效情况:
问题1:丢失了谷歌地图API必需的api=1参数
你的助手方法generate_url在设置uri.query = parameters.to_query时,直接覆盖了原URL里的api=1参数。谷歌地图的路线接口必须要有api=1才能正确识别请求格式,没有这个参数的话,即使传递了origin和destination,也不会按预期生成路线。
问题2:destination参数包含多余空格
从控制台日志能看到,你的destination值是"40.712775, -74.005973",里面逗号后面带了空格。谷歌地图解析坐标时,这种空格会导致识别失败,必须去掉。
修复方案
方案1:修复助手方法,保留原有参数并清理空格
先修改你的助手方法,确保合并原有URL的查询参数,而不是覆盖:
def generate_url(url, parameters = {}) uri = URI(url) # 解析原URL的已有参数,和新参数合并 existing_params = URI.decode_www_form(uri.query || "").to_h combined_params = existing_params.merge(parameters) # 用标准方法编码查询参数 uri.query = URI.encode_www_form(combined_params) uri.to_s end
然后在控制器里清理参数的空格:
def initialize # 去除坐标中的所有空格 clean_origin = params[:origin].gsub(/\s+/, "") clean_destination = params[:destination].gsub(/\s+/, "") redirect_to generate_url('https://www.google.com/maps/dir/?api=1', { origin: clean_origin, destination: clean_destination }) end
方案2:简化实现,直接拼接参数(更直观)
如果不想用助手方法,可以直接在控制器里拼接正确的URL,避免参数覆盖问题:
def initialize clean_origin = params[:origin].gsub(/\s+/, "") clean_destination = params[:destination].gsub(/\s+/, "") redirect_to "https://www.google.com/maps/dir/?api=1&origin=#{URI.encode_www_form_component(clean_origin)}&destination=#{URI.encode_www_form_component(clean_destination)}" end
验证效果
修复后,控制台的重定向URL应该会变成类似这样:https://www.google.com/maps/dir/?api=1&origin=40.720341%2C-74.044847&destination=40.712775%2C-74.005973
这里包含了api=1参数,且坐标没有空格,谷歌地图就能正确解析并生成路线了。
内容的提问来源于stack exchange,提问作者Theopap
相关产品推荐
相关产品推荐

