javascript - 如何将 javascript 变量传递到 Rails Controller 中?

标签 javascript ruby-on-rails ajax gmaps4rails

我正在使用 gmap4rails 来完成我的一个小项目。我想传入用户当前位置的纬度和经度值,并将这些值设置到我的名为 Pet 的模型中。宠物模型属于用户模型,用户模型有很多宠物。我希望每当创建新宠物时都能够执行此操作,以便宠物收养信息具有坐标。

据我了解,对于 AJAX 请求,它需要一个 url 来了解它应该采用哪个路径。我不知道如何将路径添加到 url 参数中,因为宠物属于模型。我做了一个 rake 路由来查看要使用哪个路由,理想情况下我应该使用 POST 路由,它是:

/users/:user_id/pets(.:format)

我是否将其复制到 url 中,或者我需要以某种方式使用 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 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 路线获得的路线...

最佳答案

Do I copy that into the url as it is or do I need to somehow get the user_id with js?

如果您在帖子末尾包含的控制台中看到错误,您将看到您正在发送两个 AJAX 请求。就像桑托什在评论中所说的那样,您应该找出原因并解决这个问题。为了解释这些错误,第一个错误被发送到 users/1/pets/users/pets,因为您的 ajax 调用的 url 选项设置为“users/pets”,这会将其附加到默认路由,而该路由不会存在(因此是 404)。第二个 AJAX 请求发送到正确的 URL,但返回 500 错误。如果您查看服务器控制台,您将看到一条类似的消息。 (提示:每当浏览器控制台报告500(内部服务器错误)时,请查看服务器终端或日志以了解详细信息。)

您的其他代码也有一些问题。首先,您已将 setCoords 定义为模型内的类方法(使用 self.setCoords ),但在 Controller 中您在该类的实例 (@pet) 上调用它。当程序到达该行时,这将导致 NoMethodError。要解决此问题,请从方法定义中删除 self,以便它仅读取 setcoords(lat, lon)

其次,您将 AJAX 调用路由到的 Controller 操作是否实际接受 AJAX 请求?您需要有一个像这样的 block :

respond_to do |format|
  format.html
  format.js {
    # do stuff
  }
end

如果是处理请求的 create 操作,那么您将需要上述 block ,以及一个 create.js.erb 文件(默认情况下),其中包含要发送回浏览器的 JavaScript 代码刷新页面的状态。

关于javascript - 如何将 javascript 变量传递到 Rails Controller 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24114181/

相关文章:

javascript - 什么时候 jQuery SlideDown 不起作用,而 SlideUp 起作用?

javascript - 不变量失败 : Cannot collect without a droppable ref

javascript - Three.js 中的光线转换和容器

ruby-on-rails - rails : use jbuilder template in various controller methods

javascript - 如何使用 Flipclock.js 在 ruby​​ on Rails 中进行倒计时?

ruby-on-rails - 亚马逊产品 API 和 Rails

javascript - 将 ES6 生成器与 XMLHttpRequest 结合使用

jquery - 如何使用 jQuery 检测 'any' ajax 请求是否完成?

javascript - 网络应用程序设计思想

javascript - ng-mouseover 和 ng-mouseleave 上的按钮不会按预期显示 - AngularJS