尝试使用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
因此,如果我转到资产/新的基本设置,我将看到新的资产表单,使用文件字段选择要上传的图像,当我保存时,我得到上面的错误。我从来没有创建过设计用户模型,也没有添加任何before_filter authenticate_user!对控制器。
它不会将我重定向到登录页面,但会引发错误。所以我尝试使用'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 %>
答案 0 :(得分:0)
InvalidAuthenticityToken
由rails本身生成,而不是由carrierwave或rails生成,这意味着您不包括csrf-token隐藏字段。这通常由传统表单的表单构建器和ajax的jquery-ujs(或等效的)添加。
有很多方法可以实现。不使用表单构建器是常见的。在您的情况下,我认为您将导轨与:html => { :multipart => true }
混淆。 file_field
设置了编码automatically,因此该代码最多不会执行任何操作。删除那个块,让我们看看你是怎么做的。
PS。 carrierwave不支持:multiple => true
。有解决方法,但这属于另一个问题。