繁体   English   中英

如何将JavaScript变量传递到Rails控制器中?

[英]How to pass in javascript variables into a Rails controller?

我正在为我的一个小项目使用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文件会更好吗? 我以为也许我可以嵌入我从耙子路线获得的路线...

我是将其原样复制到url中还是需要以某种方式获取js的user_id?

如果您在文章结尾处包含的控制台中读取了该错误,则会看到您正在发送两个AJAX请求。 就像Santosh在评论中所说的那样,您应该找出原因并加以解决。 不过,为了说明错误,第一个错误被发送到users / 1 / pets / users / pets,因为您的ajax调用的url选项设置为“ users / pets”,这会将其附加到默认路由,而该路由不会存在(因此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动作,则需要上面的代码块,以及一个create.js.erb文件(默认情况下),该文件将包含JavaScript代码以发送回浏览器以刷新页面的内容。州。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM