我已经和这个家伙争吵了一段时间并且做了所有的Googlies(here,here和许多同样无益的其他人)但无济于事。
官方错误就是这个,在我的create方法的第一行调用:
无法自动加载常量ActiveStorage :: Blob :: Analyzable,预期/Users/lizbayardelle/.rvm/gems/ruby-2.5.0/gems/activestorage-5.2.1/app/models/active_storage/blob/analyzable.rb来定义它
我正在通过ActiveStorage创建一个blog
模型,has_one_attached
:pdf
和一个:image
。这些关系都在blog
模型中:
class Blog < ApplicationRecord
belongs_to :user
has_one_attached :image
has_one_attached :pdf
end
我的控制器blogs#create
模型在这里:
def create
@blog = Blog.new(blog_params)
@blog.user_id = current_user.id
if @blog.published
@blog.published_on = DateTime.current
end
respond_to do |format|
if @blog.save
@blog.image.attach(params[:image])
@blog.pdf.attach(params[:pdf])
format.html { redirect_to @blog, notice: 'Blog was successfully created.' }
format.json { render :show, status: :created, location: @blog }
else
format.html { render :new }
format.json { render json: @blog.errors, status: :unprocessable_entity }
end
end
end
以此作为我的参数:
def blog_params
params.require(:blog).permit(:title, :teaser, :body, :cta, :category, :linked_module, :published, :published_on, :user_id, :image, :pdf)
end
我按照this教程设置ActiveStorage与S3和this一个设置ActiveStorage一般。
我的storage.yml
看起来像这样:
test: service: Disk root: <%= Rails.root.join("tmp/storage") %>
local: service: Disk root: <%= Rails.root.join("storage") %>
# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) amazon: service: S3 access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %> secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %> region: us-west-1 bucket: *bucket name*
With this in my `secrets.yml` (which is GitIgnored, if it makes a difference):
development:
secret_key_base: actual key here
AWS_ACCESS_KEY_ID: actual key here
AWS_SECRET_ACCESS_KEY: actual key here
test:
secret_key_base: actual key here
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
AWS_ACCESS_KEY_ID: <%= ENV["AWS_ACCESS_KEY_ID"] %>
AWS_SECRET_ACCESS_KEY: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
recaptcha_site_key: <%= ENV["RECAPTCHA_SITE_KEY"] %>
recaptcha_secret_key: <%= ENV["RECAPTCHA_SECRET_KEY"] %>
我的新博客表单如下所示:
<%= simple_form_for(@blog) do |f| %>
<%= f.error_notification %>
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
<div class="form-inputs">
<div class="form-group">
<%= f.label :category %>
<%= f.select :category, options_for_select(['General', 'House', 'Spouse', 'Kids', 'Other'], { class: "form-control" }) %>
</div>
<div class="form-group">
<%= f.label :title %>
<%= f.text_field :title, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :teaser %>
<%= f.text_area :teaser, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :body %>
<%= f.trix_editor :body %>
</div>
<div class="form-group">
<%= f.label :cta %>
<%= f.text_field :cta, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :linked_module %>
<%= f.text_field :linked_module, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label "Blog Image" %><br />
<%= f.file_field :image %>
</div>
<div class="form-group">
<%= f.label "Linked PDF" %><br />
<%= f.file_field :pdf %>
</div>
<div class="form-group text-center">
<%= f.input :published %>
</div>
</div>
<div class="form-actions text-center">
<%= f.button :submit %>
</div>
<% end %>
我确实输入了配置键到Heroku,但由于这个错误在localhost上,我看不出有什么不同。我也确保安装了minimagick。
谁能看到这里出了什么问题?在我给它的所有问题之后,我真的变得讨厌ActiveStorage ......
附加信息
Here's my Gemfile:
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.5.0'
gem 'rails', '~> 5.2.0'
gem 'puma', '~> 3.11'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.2'
gem 'jbuilder', '~> 2.5'
gem 'mini_magick'
gem 'jquery-rails'
gem 'devise'
gem 'bootsnap'
gem 'bootstrap', '~> 4.1.3'
gem 'sprockets-rails'
gem 'bootstrap-sass'
gem 'bcrypt', '~> 3.1.7'
gem 'friendly_id', '~> 5.1.0'
gem 'stripe'
gem 'figaro'
gem 'magnific-popup-rails', '~> 1.1.0'
gem 'simple_form'
gem 'acts-as-taggable-on'
gem 'aws-sdk' , '~> 3'
gem 'aws-sdk-s3', require: false
gem 'simple_form_extension'
gem 'recaptcha', require: "recaptcha/rails"
gem 'font-awesome-rails'
gem 'trix', git: 'https://github.com/bcoia/trix.git'
group :production do
gem 'pg', '~> 0.20.0'
gem 'rails_12factor'
end
group :development, :test do
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
gem 'sqlite3'
end
group :development do
gem 'sqlite3'
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
group :test do
gem 'sqlite3'
gem 'capybara', '>= 2.15', '< 4.0'
gem 'selenium-webdriver'
gem 'chromedriver-helper'
end
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
[1]: https://medium.com/alturasoluciones/setting-up-rails-5-active-storage-with-amazon-s3-3d158cf021ff
[2]: https://edgeguides.rubyonrails.org/active_storage_overview.html
修复此问题是在订单中运行以下内容。
rails active_storage:install
rake db:migrate
如果你得到错误,无法保存新的关联image_attachment,这主要是因为has_one
关联。要解决此问题,您应该执行以下操作
@blog.image.purge
@blog.image.attach(params[:image])
我知道这已经有了答案,但我偶然发现了重新安装active_storage和迁移我的数据库不起作用的情况。
我偶然发现了这个论坛:https://groups.google.com/forum/#!topic/rubyonrails-talk/RaFBG6wi2K0并找到了一个让我朝着正确方向前进的答案。
我的问题是我的storage.yml文件不正确,甚至不是有效的yml。尝试通过在线yml验证器运行storage.yml文件:http://www.yamllint.com/
它未能验证,我能够从那里找出我的问题。