我在视图中创建了一个定期发送数据的AJAX:
$.ajax({
type: "PATCH",
url: "/drivers/" + <%= current_user.id %> + "/coordinates",
data: data,
success: postSuccess
});
到:
def update
if @driver.update_attributes(driver_params)
head :ok
else
render status: :unprocessable_entity, json: {
error: @driver.errors
}
end
end
这似乎在大多数情况下完美无缺。但有时它会被退回:
An ActionController::InvalidAuthenticityToken occurred in drivers#coordinates
Request:
-------------------------------
* URL :
* HTTP Method: PATCH
* IP address :
* Parameters : {"latitude"=>"59.9", "longitude"=>"10.77", "controller"=>"drivers", "action"=>"coordinates", "id"=>"16"}
* Timestamp : 2016-06-10 17:55:56 +0200
* Server :
* Rails root : /var/deploy/
* Process: 6997
-------------------------------
Session:
-------------------------------
* session id: [FILTERED]
* data: {"session_id"=>"b08d5d2604631c91fc2db202",
"_csrf_token"=>"3seCLYJYUuUX0JWlU8Z83frEE3HxA="}
这很奇怪,80%的时间这完美无缺。也许是它所做的更新率触发它,说实话我不确定。通常用户在一个页面上运行并在后台运行并更新其GEO坐标。
有人知道如何解决这个问题吗?有没有办法添加一个适用于AJAX的真实性令牌,如果是这样,它会多次工作(因为当它们在同一页面上时可以触发50-100次)。
答案 0 :(得分:0)
如果您查看错误通知,它会生成此异常InvalidAuthenticityToken
这意味着您在没有auth-token的情况下触发POST / PATCH请求,默认情况下在ApplicationController中定义
protect_from_forgery with: :exception
你需要在这些参数中做些什么:
Parameters : {"latitude"=>"59.9", "longitude"=>"10.77", "controller"=>"drivers", "action"=>"coordinates", "id"=>"16"}
添加由view标记生成的标记:
<%= csrf_meta_tag %>
如果你使用jquery,你可以像这样抓住
$('meta[name=csrf-token]').attr('content');
您可以关闭CSRF保护,但除非您使用纯JSON API,否则我不会推荐。相反,当你执行$ .ajax时,将它添加到你的参数中。你可以使用这样的东西
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
}
});
或在你里面ajax调用
$.ajax({
...
beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token',$('meta[name="csrf-token"]').attr('content'))}
...