它可以工作,但由于缺少真实性标记而停止:

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script"});
  return false;
});

所以我试着这样添加:

$(".ajax-referral").click(function(){
  $.ajax({type: "POST", url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, dataType: "script"});
  return false;
});

它作为参数正确地传递了auth_令牌,但似乎丢失了我表单的其余部分.

无论如何都要完成发送有效的表单数据和真实性令牌吗?

这是一个rails环境.我脑子里就有这个.

= javascript_tag "var AUTH_TOKEN = '#{form_authenticity_token}';" if protect_against_forgery?

Things I've tried

1.

= hidden_field :authenticity_token, :value => form_authenticity_token

2.

$.ajax({type: "POST", url: $(this).parent("form").attr("action"), dataType: "script", authenticity_token: AUTH_TOKEN});

3.

// Always send the authenticity_token with ajax
$(document).ajaxSend(function(event, request, settings) {
    if ( settings.type != 'GET' ) {
        settings.data = (settings.data ? settings.data + "&" : "")
            + "authenticity_token=" + encodeURIComponent( AUTH_TOKEN );
    }
});

推荐答案

实际上,您正在读取表单的action属性,并向其发送一个post ajax请求.要发送表单数据,您必须提交表单,或者可以序列化表单数据,并以ajax请求的形式发送,如

$(".ajax-referral").click(function(){
  $.ajax({
      type: "POST", 
      url: $(this).parent("form").attr("action") + "?&authenticity_token=" + AUTH_TOKEN, 
      data:$(this).parent("form").serialize(),
      dataType: "script"
      });
  return false;
});

这样做将序列化表单数据,并将其与ajax请求一起发送,而真实性令牌已经通过查询字符串发送

Ruby-on-rails相关问答推荐

Rails:嵌套命名空间产生一个奇怪的部分路径,导致MissingTemplate错误

form_with正在try 用错误的路径生成操作

为Rails服务器推荐的交付类型

会话控制器中的某种问题

验证以确保唯一性但忽略空值?

Ruby/Rails 中的类方法与常量

注册表单上是否需要 CSRF 保护?

用 url_for 查询参数?

Rails ActiveRecord:验证单个属性

Rails Mailer Net::OpenTimeout: execution expired 仅在生产服务器上出现异常

Rails ActiveRecord 查询日期范围

Rails,获取模型中的资源路径

不允许请求来源:使用 Rails5 和 ActionCable 时的 http://localhost:3001

在本地 Rails 开发环境中获取真实 IP 地址

Rails:带参数的 URL/路径

禁用 JS/Ajax 请求时的 ActionController::InvalidAuthenticityToken

Heroku - 在浏览器中显示当前提交的哈希

如何翻译 ActiveRecord 模型类名称?

如何更改 Rails 3 控制器中视图文件的默认路径?

ArgumentError:ApplicationController 的副本已从模块树中删除,但仍处于活动状态