Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to autoload constant ActiveStorage::Blob::Analyzable Error with Rails 5.2, AWS S3, and ActiveStorage

I've been battling this guy for a while and have done all the Googlies on it (here, here, and many equally-unhelpful others) but to no avail.

The official error is this, called on the first line of my create method:

Unable to autoload constant ActiveStorage::Blob::Analyzable, expected /Users/lizbayardelle/.rvm/gems/ruby-2.5.0/gems/activestorage-5.2.1/app/models/active_storage/blob/analyzable.rb to define it

I'm creating a blog model, which has_one_attached :pdf and one :image, both through ActiveStorage. These relationships are all in the blog model:

class Blog < ApplicationRecord
  belongs_to :user
  has_one_attached :image
  has_one_attached :pdf
end

My controller blogs#create model is here:

  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

With this as my params:

def blog_params
  params.require(:blog).permit(:title, :teaser, :body, :cta, :category, :linked_module, :published, :published_on, :user_id, :image, :pdf)
end

I followed this tutorial to set up ActiveStorage with S3 and this one to set up ActiveStorage in general.

My storage.yml looks like this:

    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"] %>

My new blog form looks like this:

<%= 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 %>

I did input the config keys to Heroku, but since this error is on localhost I can't see that making a difference. I also made sure minimagick is installed.

Can anyone see what's going wrong here? I'm really growing to hate ActiveStorage after all the issues it's giving me...

ADDITIONAL INFORMATION

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
like image 448
Liz Avatar asked Sep 16 '18 21:09

Liz


2 Answers

Fix for this is to run the following in the order.

rails active_storage:install
rake db:migrate

And if you get the error, Failed to save the new associated image_attachment, it's mostly because of has_one association. To fix it, you should do the following

@blog.image.purge
@blog.image.attach(params[:image])
like image 99
Kedarnag Mukanahallipatna Avatar answered Sep 22 '22 11:09

Kedarnag Mukanahallipatna


In my case the problem was with Autoloading and Reloading Constants (Zeitwerk Mode) (Rails 6.1)

I solved changing the file: /config/environments/development.rb

config.autoloader = :classic

(source: https://github.com/rails/rails/issues/38681)

like image 26
eveevans Avatar answered Sep 24 '22 11:09

eveevans