Rails [问题已解决,谢谢各位] Ajax 方式提交表单,包含文件上传字段时,ActionController::InvalidAuthenticityToken

eiyamaya · 2016年07月21日 · 最后由 llwang 回复于 2016年11月10日 · 2836 次阅读

rails 中,一个用ajax方式提交(post)的表单,表单中包含文件上传字段的时候,提交表单会抛出异常;不包含文件上传字段的时候可以提交成功。 (文件上传使用的是carrierwave) 异常如下:

大神们,这是为什么呀

------------------------------------------------------更新-------------------------------------------------------------------

其实我也没做多少,只是在 form_for 里添加了 remote: true,当然也在 controller 的 create action 中做了处理。

现在的问题是,如果表单不传入文件字段的时候可以创建成功,如果表单传入文件字段,则报错

表单代码如下:

  <%= form_for [:admin, video], remote: true, html: {class: "form-horizontal"} do |f|%>
    <%= f.hidden_field(:course_id, value: @course.id) %>
    <div class="form-group">
      <%= f.label(:num, '视频序号',class: 'col-sm-2 control-label') %>
      <div class="col-sm-10">
        <%= f.text_field :num, class: 'form-control' %>
      </div>
    </div>
    <div class="form-group">
      <%= f.label(:name, '视频名称',class: 'col-sm-2 control-label') %>
      <div class="col-sm-10">
        <%= f.text_field :name, class: 'form-control' %>
      </div>
    </div>
    <div class="form-group">
      <%= f.label(:video, '视频文件',class: 'col-sm-2 control-label') %>
      <div class="col-sm-10">
        <%= f.file_field :video %>
        <p class="help-block"><a href="" class="btn btn-default">上传</a></p>
      </div>
    </div>
    <div class="form-group">
      <div class="col-sm-offset-2 col-sm-10">
        <%= f.submit "提交", class: %w(btn btn-default) %>
      </div>
    </div>
<% end %>

controller中的代码如下:

def create
  course = Course.new(course_params)
  if course.valid?
    course.save
    redirect_to admin_courses_path, notice: "创建成功!"
  else
    redirect_to new_admin_course_path, notice: course.errors.full_messages
  end
end

#1 楼 @hww 谢谢啊,我去看看

#1 楼 @hww 我试了一下,这个 gem 不兼容 rails5

#4 楼 @huacnlee 嗯,谢谢华顺哥。但是我使用了 jquery_ujs,layout 里面也有 csrf_meta_tags,但是就是不行。。。。

如果是那样,你就得讲清楚怎么上传的了,贴代码啊

#9 楼 @doabit 非常感谢,我参考:https://github.com/JangoSteve/remotipart/issues/155,使用 gem 'remotipart', github: 'mshibuya/remotipart', ref: '88d9a7d',将问题解决

我的是在路由写了一个 post 请求的 API,请求时也是报这个参数。目前还没有解决方案 这是代码

需要 登录 后方可回复, 如果你还没有账号请 注册新账号