0

尝试使用carrierwave上传文件时出现错误:

ActionController::InvalidAuthenticityToken in AssetsController#create

脚步:

1. rails new testapp
2. Add devise and carrierwave to Gemfile
3. rails g devise:install
4. rails g scaffold asset path:string  #will mount uploader to path
5. rails g uploader asset
6. rake db:migrate
7. Edit model/asset.rb add mount_uploader :path, AssetUploader
8. modify asset form to use multipart and file_field for :path

因此,通过基本设置,如果我转到 assets/new,我将看到新的资产表单,使用文件字段选择要上传的图像,当我保存时,我会收到上述错误。我从未创建过设计用户模型,也从未添加过任何 before_filter authenticate_user!给控制器。

它不会将我重定向到登录页面,但会引发错误。因此,我尝试使用“用户”创建设计模型并注册并登录,即使我从未设置过“before_filter authenticate_user!”,我现在也可以使用资产表单进行上传。如果我注销并尝试再次上传,我会收到同样的错误。

那么有了这些信息,为什么设计会自动阻止我在我的应用程序中使用上传表单?

<%= form_for(@asset, :html => { :multipart => true}) do |f| %>
  <% if @asset.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@asset.errors.count, "error") %> prohibited this asset from being saved:</h2>

      <ul>
      <% @asset.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :path %><br>
    <%= f.file_field :path, :multiple => true %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
4

1 回答 1

0

InvalidAuthenticityToken由 rails 本身生成,而不是由 carrierwave 或 rails 生成,这意味着您不包括 csrf-token 隐藏字段。这通常由表单构建器为常规表单添加,而 jquery-ujs(或等效的)为 ajax。

有很多方法可以发生这种情况。不使用表单构建器是常见的。就您而言,我认为您将 rails 与:html => { :multipart => true }. 自动file_field设置编码,所以充其量该代码什么都不做。删除那个块,让我们看看你是怎么做的。

附言。载波不支持:multiple => true。有解决方法,但这属于另一个问题。

于 2013-09-25T14:54:10.277 回答