我正在使用gmap4rails处理我的一个小项目。我想从用户的当前位置传入纬度和经度值,并将这些值设置到我的名为Pet的模型中。宠物模型属于用户模型,用户模型有许多宠物。我希望每当创建新宠物时都能够这样做,以便宠物采用信息具有坐标。
我理解,对于AJAX请求,它需要一个url来理解它应该采用哪条路径。由于宠物属于模型,我不确定如何将路径添加到url参数中。我做了一个rake路线来查看使用哪条路线,理想情况下我应该使用POST路线:
/users/:user_id/pets(.:format)
我是否将其复制到网址中,或者我是否需要以某种方式使用js获取user_id?
到目前为止,我已经创建了一个如下所示的js文件:
var lat;
var lon;
$(document).ready(function() {
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(setLatLon);
}
function setLatLon(position) {
lat = position.coords.latitude;
lon = position.coords.longitude;
}
//function for logging in and passing lat and lon to the controller
$(function() {
$("#save").click(function() {
//create ajax request
console.log("creating ajax request")
$.ajax({
type: 'POST',
url: "users/pets",
data: 'lat=' + lat + '&lon=' + lon
})
});
});
});
宠物模型:
class Pet < ActiveRecord::Base
belongs_to :user
validates :name, presence: true
validates :species, presence: true
validates :breed, presence: true
validates :description, presence: true
def self.setCoords(lat, lon)
self.lat = lat
self.lon = lon
end
end
Pet_controller创建def:
def create
@user = User.find(params[:user_id])
@pet = @user.pets.create(pet_params)
@pet.setCoords(params[:lat], params[:lon])
if @pet.save
redirect_to user_path(@user)
else
render 'new'
end
end
控制台出错:
creating ajax request getCoords.js?body=1:17
POST http://localhost:3000/users/1/pets/users/pets 404 (Not Found) jquery.js?body=1:9667
POST http://localhost:3000/users/1/pets 500 (Internal Server Error) jquery.js?body=1:9667
尝试将js文件另存为js.erb文件会更好吗?我想也许我可以嵌入从rake路线获得的路线......
答案 0 :(得分:0)
我是否将其复制到网址中,或者我是否需要以某种方式使用js获取user_id?
如果您阅读了帖子末尾包含的控制台中的错误,您将看到您正在发送两个AJAX请求。就像桑托什在评论中说的那样,你应该找出原因并解决这个问题。为了解释错误,第一个被发送给users / 1 / pets / users / pets,因为你的ajax call&url选项被设置为&#39; users / pets&#39 ;,将其附加到默认路由,并且该路由不存在(因此404)。第二个AJAX请求被发送到正确的URL但返回500错误。如果查看服务器控制台,您将看到这些行的消息。 (提示:每当浏览器控制台报告500 (Internal Server Error)
时,请查看您的服务器终端或日志以获取详细信息。)
您的其他代码也存在一些问题。首先,您已将setCoords定义为模型中的类方法(使用self.setCoords
),但在您的控制器中,您将在该类的实例(@pet)上调用它。当程序到达该行时,这将导致NoMethodError。要解决此问题,请从方法定义中删除self
,以便它只读取setcoords(lat, lon)
。
其次,是您将AJAX调用路由到实际接受AJAX请求的控制器操作吗?你需要这样一个块:
respond_to do |format|
format.html
format.js {
# do stuff
}
end
如果是处理请求的创建操作,那么您将需要上面的块,以及一个create.js.erb文件(默认情况下),该文件将包含要发送回浏览器的JavaScript代码刷新页面的状态。