1

好的,所以在其中一个页面上的 Rails 应用程序中,我需要传递一个 Javascript 变量,以便它可用于 rails。现在一个运行服务器端,一个运行客户端,所以我知道这非常困难。我查看了互联网并找到了一个解决方案,该解决方案涉及在我的外部 javascript 页面中包含的函数中动态创建表单。

基本上,使用document.createElement语句制作了一个带有隐藏字段的表单,隐藏字段被赋予了我想要传递给 rails 的值,然后form.submit()被调用以便提交表单。该表格被赋予了一种发布方法,并被赋予了一条路径。因此,当提交它时,页面会重定向到另一个页面,其中隐藏字段现在位于 params 哈希中,并且可以通过带有params[:param].

这在一段时间内效果很好,直到我们开始使用 session 来跟踪登录用户。单击要使用该动态表单重定向的按钮后,会话将被清除。我在网上发现的关于会话被清除的唯一一件事是,当 rails 检测到 CSRF 时,它会清除会话。

那么我正在做的事情会导致 Rails 检测到 CSRF 从而清除我的会话吗?还有其他任何人都知道的会议可能被清除的原因吗?另外,如果没有 ajax(因为我只是不擅长搞砸,它不能很好地发挥作用。)我是否缺少传递 javascript 变量的另一种好方法(它必须是 javascript,我正在使用 javascript 函数获取用户当前位置)以便它可用于轨道?(我在想而不是对表单进行 javascript 处理,我可能只是在我的页面上制作一个隐藏的表单,尽管这有点不那么优雅,因为任何查看源代码的人都可以看到它并想知道为什么它在那里并搞砸了它)

如果有人感兴趣,下面是我的动态表单函数的代码。

function post_to_url(path, params, method) {
method = method || "post"; // Set method to post by default, if not specified.


var form = document.createElement("form");  
form.setAttribute("method", method);
form.setAttribute("action", path);     //page to go redirect to when form submitted


var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");

//after form is submitted params is available by params[:location]
hiddenField.setAttribute("name", 'location');     
hiddenField.setAttribute("value", params )

form.appendChild(hiddenField);



document.body.appendChild(form);



form.submit();
}
4

2 回答 2

1

任何形式的请求和 ajax 都必须通过 CSRF 令牌。您需要在表单中创建一个名为 的隐藏字段authenticity_token。然后您需要从元标记中获取值:

<meta content="some_token_value" name="csrf-token" />

像这样:

var token = "";
var tags = document.getElementsByTagName("meta");
for(var i = 0; i < tags.length; i++) { 
  if(tags[i].name == "csrf-param") { 
    token = tags[i].content;
  }
}

然后只需将其放入隐藏标签的值中,就像您对位置值所做的那样。

于 2012-10-22T18:09:58.810 回答
0

您可以在 javascript 文件中添加 erb 行:

var csrf_token = '<%= form_authenticity_token %>';

然后在您的请求中,添加'authenticity_token' : csrf_token后期数据。

于 2012-10-22T18:28:58.150 回答