当前位置: 首页 > 面试题库 >

Rails无法在Ajax帖子上重新加载会话

洪鸿博
2023-03-14
问题内容

我在使用jQuery时遇到Rails和ajax的一个非常奇怪的问题(尽管我不认为它特定于jQuery)。

我的Rails应用程序使用cookie会话存储,并且我有一个非常简单的登录名,用于设置会话中的用户ID。如果未在会话中设置user_id,它将重定向到登录页面。这没有问题。jQuery
GET请求也可以正常工作。问题是当我执行jQuery POST时-
浏览器将会话Cookie正常发送(我已通过Firebug确认并将cookie.dumps.cookies转储到日志中),但是会话为空,即会话为{}。

我正在我的application.js中执行此操作:

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

这是我的示例帖子:

$.post('/test/1', { _method: 'delete' }, null, 'json');

应该使用该控制器方法(_method:delete):

def destroy
  respond_to do |format|
    format.json { render :json => { :destroyed => 'ok' }.to_json }
  end
end

查看日志并使用Firebug,我可以确认发生ajax发布时,在请求标头中发送了正确的cookie值,但是似乎在某些时候Rails丢失了该值,因此丢失了会话,因此它将重定向到登录名页面,并且永远不会使用该方法。

我已经尝试了所有可以想到的方法来调试它,但是我想到了这可能是Rails中的错误。如果有帮助,我正在使用Rails 3.0.4和jQuery
1.5。我发现非常奇怪的是,常规(即非ajax)获取和发布请求可以正常工作,而ajax get请求可以正常运行,只是ajax发布不起作用。

试图解决此问题的任何帮助将不胜感激!

非常感谢,
戴夫


问题答案:

我将回答自己的问题,因为我已经设法弄清了正在发生的事情。如果对其他人有用,我会在这里发布!

经过进一步调查,我发现 应该 使用CSRF令牌设置请求标头的代码不是。这是原始代码:

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr('content');
  xhr.setRequestHeader('X-CSRF-Token', token);
});

发生的事情是此代码未设置标头,Rails正在接收Ajax请求,令牌不匹配,并且正在重置会话。这曾经引发一个ActionController ::
InvalidAuthenticityToken错误(如果引发错误,我想我会早点抓到这个……好吧),但是自从Rails
3.0.4起,它现在只是悄悄地重置了会话。

因此,要在标头中发送令牌,您必须执行此操作(非常感谢这篇出色的博客文章):

$.ajaxSetup({
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
  }
});

现在一切正常。很好



 类似资料:
  • 问题内容: 我有一个表单,当我单击“提交”时,应该更新同一页面上的部分文档…当我将其放置在此处时: 它按照应有的方式运行,在需要时显示问候。但是当我进入这个… 它根本不做任何事情。我究竟做错了什么? 问题答案: 该请求可能不是Ajax调用。拨打Ajax电话。用户remote_form_for代替form_for或使用jquery.form向控制器发送ajax调用。如果您使用的是jquery,请执行

  • 问题内容: 我浏览了旧的问题,并尝试了许多似乎可以做到的不同方法。我最接近的工作是在这里:如何在自定义WP_QueryAjax上实现分页 我已经尝试了一切,但没有用。页面上没有任何变化。如果您检查并单击“加载更多按钮”,则jQuery会执行“加载更多按钮”操作,因为它从更改为,即使对我来说,这似乎也不对。它并没有添加帖子,我想我缺少一些简单的东西,但是我一生都无法解决。 我的模板文件中的代码是:

  • 问题内容: 我使用弹出窗口创建新记录,并在窗口内部渲染。除此之外,我还根据其中一个组合框的selectedindex在此视图中调用a 。我可以成功将表单发布到Controller并在出现错误时将其返回到视图。但是,返回表格后,只有零件返回,而我无法渲染。因此,在提交表单之前,我又如何将其呈现为最后状态? 视图: 问题答案: 在这种情况下,您需要在没有HTML帮助程序的情况下进行自定义ajax发布。

  • 这里的例子是——https://facebook.github.io/react/tips/initial-ajax.html -修改如下。 是加载时的“占位符”,并传递给

  • 问题内容: 我已经查询了用户帖子(显然是嵌套资源),并且有一长串来自不同用户的帖子。我希望用户能够单击每个帖子旁边的小星星,以通过ajax收藏该特定帖子。关于如何实现这一目标的任何建议?我遇到的麻烦是一页上有多个收藏夹按钮,偏爱多个帖子。 这有点像Gmail在收件箱中使用收藏的电子邮件那样。其实就是这样 问题答案: 首先,您需要设置数据库来处理此问题,就我个人而言,我将使用has_many:thr

  • 问题内容: 我想在Rails应用程序的“新”视图中每3秒重新加载部分内容。 我有这个 如何每3秒重新加载一次此部分内容?我是否必须为此使用兼容的JavaScript?如何通过ujs实现呢? 问题答案: 将部分放在div中 您可以通过使用像这样的jQuery来做到这一点 现在刷新控制器动作中的部分内容以加载新内容 它肯定会工作.........