ruby-on-railsrubytrixactiontext

Can't resolve image into URL: undefined method `to_model' for #<ActiveStorage::VariantWithRecord


According to documentation I added action_text/trix to my rails app. And when I update a content. It shows me following errors. Any idea?

Showing /home/dell/code/tm/app/views/active_storage/blobs/_blob.html.erb where line #3 raised:

Can't resolve image into URL: undefined method `to_model' for #<ActiveStorage::VariantWithRecord:0x0000559255e1be40 @blob=#<ActiveStorage::Blob id: 12, key: "n48e43looijem16cdq5d48sqhu4d", filename: "Screenshot from 2021-08-28 17-10-25.png", content_type: "image/png", metadata: {}, service_name: "local", byte_size: 93757, checksum: "up8PwkoYwf+Y6NTRJvbAUA==", created_at: "2021-08-29 12:13:04.912555000 +0800">, @variation=#<ActiveStorage::Variation:0x0000559255e248d8 @transformations={:format=>"png", :resize_to_limit=>[1024, 768]}>>
Did you mean?  to_yaml

ActionView::Template::Error (Can't resolve image into URL: undefined method `to_model' for #<ActiveStorage::VariantWithRecord:0x0000559255e1be40 @blob=#<ActiveStorage::Blob id: 12, key: "n48e43looijem16cdq5d48sqhu4d", filename: "Screenshot from 2021-08-28 17-10-25.png", content_type: "image/png", metadata: {}, service_name: "local", byte_size: 93757, checksum: "up8PwkoYwf+Y6NTRJvbAUA==", created_at: "2021-08-29 12:13:04.912555000 +0800">, @variation=#<ActiveStorage::Variation:0x0000559255e248d8 @transformations={:format=>"png", :resize_to_limit=>[1024, 768]}>>
Did you mean?  to_yaml):
    1: <figure class="attachment attachment--<%= blob.representable? ? "preview" : "file" %> attachment--<%= blob.filename.extension %>">
    2:   <% if blob.representable? %>
    3:     <%= image_tag blob.representation(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]) %>
    4:   <% end %>
    5: 
    6:   <figcaption class="attachment__caption">
  
app/views/active_storage/blobs/_blob.html.erb:3

Gemfile:

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '3.0.1'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main'
gem 'rails', '~> 6.1.3', '>= 6.1.3.2'
# Use postgresql as the database for Active Record
gem 'pg', '~> 1.1'
gem 'devise'
# Use Puma as the app server
gem 'puma', '~> 5.0'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 5.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
# gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
gem 'pagy', '~> 3.5'
gem 'money-rails', '~>1.12'
gem "view_component", require: "view_component/engine"

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

gem 'metka', '~> 2.3.1'
gem 'ransack', '~> 2.4.2'
gem 'country_select', '~> 6.0'
gem 'rails-i18n', '~> 6.0.0' 

My model:

class Page < ApplicationRecord

  has_rich_text :body

end

And migration:

class CreatePages < ActiveRecord::Migration[6.1]
  def change
    create_table :pages do |t|
      t.string :title
      t.string :slug

      t.timestamps
    end
  end
end

Here is the view:

<div class="row">
  <div class="col-md-12">
    <div class="mb-3">
      <%= f.label :body, class: 'form-label required' %>
      <%= f.rich_text_area :body %>
      <%= display_error_messages(@resource, 'body') %>
    </div>
  </div>
</div>

According to documentation I didn't add body column to pages tables. Any idea? Am I miss something?

UPDATE: I addeg gem 'image_processing' to Gemfile. But result is the same :(

UPDATE 2: I also installed imagemagick in my Ubuntu.

UPDATE 3: And it's not work only in update action.


Solution

  • I found a solution.

    I was writing a Ruby Engine / Ruby Plugin as a gem, and apparently ActiveStorage was unable to figure out the polymorphic routing thanks to the namespacing.

    I had to change "views/active_storage/blobs/_blob.html.erb" as follows:

    - <%= image_tag blob.representation(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]) %>
    + <%= image_tag main_app.url_for(blob.representation(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ])) %>
    

    Thanks @rbngzlv for the answer on Github.