Ajax和控制器

时间:2016-01-03 15:22:46

标签: ruby-on-rails ajax google-geocoder

我正在尝试使用geokit和Google Geocoder获取用户的城市。我从ajax请求中获取用户的城市:

var geocoder;
var map;

function initialize(position) {
    geocoder = new google.maps.Geocoder();

    var lat = position.coords.latitude;
    var long = position.coords.longitude;

    getCitizenCity(lat, long);
}

function getCitizenCity(lat, long) {
    $.ajax({
        type: "POST",
        url: "/set_citizen_city",
        dataType: 'json',
        data: { lat: lat, long: long },
        success: function(data) {
            console.log(data);
        },
        error: function(data) {
            console.log(data);
        } 
    });
}

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(initialize);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

 google.maps.event.addDomListener(window, 'load', getLocation);

rails代码(HomeController.rb):

class HomeController < ApplicationController

   attr_reader :citizen_city

   def index
   end

   def set_citizen_city
      lat = params[:lat]
      long = params[:long]

      address = Geokit::Geocoders::GoogleGeocoder.reverse_geocode("#{lat}, #{long}")
      @citizen_city = address.city

      respond_to do |format|
          format.json { render :json => {:message => "Success"} }
      end
   end
end

我注意到如果我做了

    puts @citizen_city

在方法“set_citizen_city”中,正确的城市显示在控制台中。 但是,如果我尝试

puts @citizen_city 

在方法“index”中,控制台中不显示任何内容。

如何在控制台上显示城市名称?

1 个答案:

答案 0 :(得分:0)

我认为你在索引中看不到@citizen_city是因为它没有在那里定义。

在每个请求中,Rails会执行应用程序的新实例(据我所知),因此如果未在同一操作中定义控制器实例变量,则无法访问它们。为了解决这个问题,我建议您将latlong参数保存在数据库中,然后在索引中执行与set_citizen_city中相同的操作,然后再定义@citizen_city从数据库中获取坐标(或者可能是会话参数,如果你需要的话)