尝试上传带有引导性gem的文件时遇到了问题,但该问题与引导性本身无关。 Bootsy生成具有以下定义的表单:
<form class="bootsy-upload-form form-inline" id="new_image" data-type="json" enctype="multipart/form-data" action="/bootsy/image_galleries/67/images" accept-charset="UTF-8" data-remote="true" method="post">
<input name="utf8" value="✓" type="hidden">
<input name="authenticity_token" id="authenticity_token" value="1pQMR5j33OKupMg4TSnQafLQx1BxzWjkP1KqTfZafqDRfGqwB8r2J4FzRE+dyuoHVOw/W0qd1FZ1JoJsJFThDQ==" type="hidden">
...
当我尝试上传文件时,将执行以下行:
this.uploadInput.closest('form').submit();
我在它之前添加了警报,所以我将看到表单的序列化数据看起来如何,并且所有字段都按预期方式显示(包括真实性 token 等):
alert(this.uploadInput.closest('form').serialize());
提交表单时,在POST请求期间不发送任何数据,仅发送 header ,在浏览器检查器中看不到任何内容,在rails的日志文件中看不到任何内容,看起来像这样:
Started POST "/bootsy/image_galleries/47/images" for ::1 at 2016-02-05 11:20:04 +0100
Processing by Bootsy::ImagesController#create as HTML
Parameters: {"image_gallery_id"=>"47"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 0ms (ActiveRecord: 0.0ms)
FATAL -- :
ActionController::InvalidAuthenticityToken - ActionController::InvalidAuthenticityToken:
_ actionpack (4.2.4) lib/action_controller/metal/request_forgery_protection.rb:181:in `handle_unverified_request'_
我有以形式生成的真实性 token ,我在meta标记中有 token ,一切看起来都很好,没有错误抛出到任何地方。我还尝试创建与我的真实项目相似的示例应用程序,并且按预期方式正常工作,形成正常提交的数据-当我尝试比较附加到两者的HTML代码和javascript事件时,它们几乎相似,因为其他一些原因像ajax_pagination等 gem ,但是没有零件,应该引起这种行为。
我正在使用Rails 4.2.4,使用body元素上的data-no-turbolink属性禁用了涡轮链接,项目使用了 bootstrap ,并且包含JS库,例如jQuery,下划线,欧芹,momentjs。
我将不胜感激任何想法,可能出什么问题,为什么表格不应该提交任何数据,哪里可能有问题。在此先感谢您的提示。
更新:
只是为了说明问题,在使用AJAX发送之前,我已经拍了一张状态的照片-此javascript是jquery_ujs = jQuery的RoR适配器的一部分。您可以看到,数据在发送之前包含所有表单字段:
但是没有将数据发送到服务器:
另一方面,在我的第二个工作项目中,正在发送数据:
更新2:
只是一些更多信息,bootspy gem,它负责创建表单,该表单使用remotipart将文件附加到请求中。仍然...我正在调试JavaScript,无法识别问题。这两个项目具有相同版本的jquery和remotipart,也具有相同版本的rails。看起来这仍然是个谜。
更新3:
所以我几乎解决了这个问题-上传现在可以正常工作了,看来这是JavaScript库顺序的问题。一旦查明确切问题,我将立即发布结果-我将撤消更改并尝试再次修复。
最佳答案
问题是与application.js中包含的javascript库顺序有关。 Bootsy是在jquery-fileupload之后定义的。看起来,必须在使用Bootsy之前对其进行定义,并且使用此设置,两者都可以很好地工作。因此,在声明之前:
//= require jquery-fileupload
//= require bootsy
//= require bootsy/locales/cs.js
之后(工作):
//= require bootsy
//= require bootsy/locales/cs.js
//= require jquery-fileupload
关于ruby-on-rails - Rails-在AJAX调用期间表单未提交任何数据-文件上传-422状态码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35309889/