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!」を設定したことがないにもかかわらず、アセットフォームを使用してアップロードできるようになりました。ログアウトして再度アップロードしようとすると、同じエラーが発生します。

その情報があれば、devise がアプリでアップロード フォームを自動的に使用できないようにする理由はありますか?

<%= 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キャリアウェーブやレールではなく、レール自体によって生成されます。これは、csrf-token 隠しフィールドが含まれていないことを意味します。これは通常、従来のフォームの場合はフォームビルダーによって追加され、ajax の場合は jquery-ujs (または同等のもの) によって追加されます。

これには多くの方法があります。フォームビルダーを使用しないことはよくあることです。あなたの場合、レールと を混同していると思います:html => { :multipart => true }file_fieldエンコーディングを自動的に設定するため、せいぜいそのコードは何もしません。そのチャンクを削除して、様子を見てみましょう。

ps。キャリアウェーブには対応していません:multiple => true。回避策はありますが、それは別の質問に属します。

于 2013-09-25T14:54:10.277 に答える