Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rails使用AJAX设计身份验证令牌_Ajax_Ruby On Rails 4_Devise - Fatal编程技术网

Rails使用AJAX设计身份验证令牌

Rails使用AJAX设计身份验证令牌,ajax,ruby-on-rails-4,devise,Ajax,Ruby On Rails 4,Devise,我正在使用Desive作为身份验证系统制作基于AJAX的应用程序。我遇到的问题是,当我使用Desive with AJAX登录时,当视图发生更改并显示“注销”按钮时,单击时会显示此错误: ActionController::InvalidAuthenticityToken in Customization::SessionsController#destroy ActionController::InvalidAuthenticityToken Parameters: {"_method"

我正在使用Desive作为身份验证系统制作基于AJAX的应用程序。我遇到的问题是,当我使用Desive with AJAX登录时,当视图发生更改并显示“注销”按钮时,单击时会显示此错误:

ActionController::InvalidAuthenticityToken in Customization::SessionsController#destroy

ActionController::InvalidAuthenticityToken

Parameters:

{"_method"=>"delete",
 "authenticity_token"=>"hitX5aEjoTzi3tKP3y76+c60MuJumv5mwNEjyGUOQiY="}
这里有我的Desive会话控制器用于登录的创建方法(为了实现AJAX,我不得不做一些更改):

在_success.js.erb文件中签名:

$("body").empty();
$("body").append("<%= j(render template: 'layouts/user') %>");
$("body").empty();
$("meta[name='csrf-token']").remove()
$("meta[name='csrf-param']").remove()
$("head").append("<meta name='csrf-token' content='<%= form_authenticity_token %>'>");
$("head").append("<meta name='csrf-param' content='<%= request_forgery_protection_token %>'>");
$("body").append("<%= j(render template: 'user/logged_signed') %>");

如何使用AJAX发送真实性令牌?我可以通过render中的locals选项将其发送给“layouts/user”并以这种方式使用吗?

我有解决方案。问题是csrf_meta_标记在创建新会话时没有更新。该问题的解决方案是在sign_in_success.js.erb文件中包含额外的代码:

$("body").empty();
$("body").append("<%= j(render template: 'layouts/user') %>");
$("body").empty();
$("meta[name='csrf-token']").remove()
$("meta[name='csrf-param']").remove()
$("head").append("<meta name='csrf-token' content='<%= form_authenticity_token %>'>");
$("head").append("<meta name='csrf-param' content='<%= request_forgery_protection_token %>'>");
$("body").append("<%= j(render template: 'user/logged_signed') %>");
$(“body”).empty();
$(“meta[name='csrf-token'])。删除()
$(“meta[name='csrf-param'])。删除()
$(“标题”)。附加(“”);
$(“标题”)。附加(“”);
$(“正文”)。追加(“”);
上面的代码首先清空body元素,然后从csrf_meta_tags helper创建的DOM meta标记中删除。之后,我们手动添加新的csrf令牌和csrf参数,这次我们的新真实性令牌被分配给meta name=“csrf令牌”

之后,当我们单击“用户/已登录”模板呈现的“注销”按钮时,我们成功注销并返回到根路径