ActiveStorage 和直接上传在开发中不起作用

Nie*_* B. 5 ruby-on-rails rails-activestorage

我正在试验 ActiveStorage,因为我想创建一个 Rails 应用程序,用户可以在其中直接上传到 DigitalOcean 空间。

但是,我已经遇到了 CSRF 问题。

我在我的 storage.yml 中声明了数字海洋:

do:
  service: S3
  access_key_id: this_is_a_secret
  secret_access_key: this_is_also_a_secret
  region: ams3
  bucket: this_is_also_a_secret
  endpoint: 'https://this_is_also_a_secret.ams3.digitaloceanspaces.com'
Run Code Online (Sandbox Code Playgroud)

我选择了我的存储服务 development.rb

config.active_storage.service = :do
Run Code Online (Sandbox Code Playgroud)

我已经将 aws gem 添加到 Gemfile

gem "aws-sdk-s3", require: false
Run Code Online (Sandbox Code Playgroud)

activestorage在我的 javascript 包中需要。

我已将以下内容添加到我的视图中以进行测试:

= form_for(VideoUpload.first, url: "/") do |form|
  div = form.file_field :file, direct_upload: true
  div = form.submit("Send that file")
Run Code Online (Sandbox Code Playgroud)

当我提交表单时,activestorage.js 库会启动。它调用它又http://127.0.0.1:3000/rails/active_storage/direct_uploads由于缺少 CSRF 令牌而抛出 422。我已经检查了请求,控制器没有错。HTTP 标头中没有设置 CSRF 令牌,X-CSRF-Token奇怪地设置为undefined.

请求正文包含:{"blob":{"filename":"9T6qqsA-png-wallpapers.jpg","content_type":"image/jpeg","byte_size":122990,"checksum":"gqU9VBgS9mmH7s45qHIbug=="}},所以这里也没有 CSRF 令牌。

但是指定输入文件元素的表单包含一个标记,所以我认为它activestorage.js会被选中。

我在这里缺少什么?文档https://edgeguides.rubyonrails.org/active_storage_overview.html#direct-uploads并不暗示 JS 端的任何特殊配置是必要的。

我正在使用 Rails 5.2.1 和 Ruby 2.5.1