Ошибка Ruby on Rails Cloudinary: отсутствует сервисный адаптер для «Cloudinary»

#ruby-on-rails #ruby #ruby-on-rails-6 #cloudinary

#ruby-on-rails #ruby #ruby-on-rails-6 #cloudinary

Вопрос:

У меня проблема с Cloudinary.
Когда я пытаюсь загрузить фотографию через форму обновления, я получаю сообщение об ошибке на странице редактирования:

 RuntimeError in ProductsController#update
Missing service adapter for "Cloudinary"
Exception Causes
LoadError: cannot load such file -- active_storage/service/cloudinary_service
 

У меня есть мой Gemfile gem 'cloudinary' . И у Gemfile.lock меня есть cloudinary (1.2.4)

Я также запустил:

 rails active_storage:install
rails db:migrate
 

Если я использую помощник Cloudinary::Uploader.upload() , rails c он работает. Но в форме это не работает.

storage.yml

 cloudinary:
  service: Cloudinary
 

В средах разработки и производства у меня

 config.active_storage.service = :cloudinary
 

Это моя форма в

 edit.html.erb
<div class="container">
  <%= simple_form_for(@product) do |f| %>
    <%= f.input :title %>
    <%= f.input :category, collection: PRODUCT_CATEGORY, label: "Type" %>
    <%= f.input :price %>
    <%= f.input :photo, as: :file %>
    <%= f.submit class: "btn btn-primary"%>
  <% end %>
</div>
 

Моя модель

В модели также есть поле с именем filename

 class Product < ApplicationRecord
  has_one_attached :photo
  validates :title, presence: true, length: { maximum: 250 }
  validates :category, presence: true, inclusion: { in: PRODUCT_CATEGORY }
  validates :description, length: { maximum: 500 }
  validates :price, presence: true
  validates :rating, presence: true, inclusion: { in: PRODUCT_RATING }
end
 

И мой контроллер

 class ProductsController < ApplicationController
  skip_before_action :authenticate_user!, only: [:index]
  before_action :set_product, only: %i[edit update destroy]
  def edit
  end
  def update
    @product.update(product_params)
    redirect_to root_path
  end
  private
  def set_product
    @product = Product.find(params[:id])
    authorize @product # For Pundit
  end
  def product_params
    params.require(:product).permit(:title, :category, :price, :rating, :photo)
  end
end
 

Комментарии:

1. Похоже, у вас может быть более старая версия Cloudinary gem, которая еще не поддерживала активное хранилище. Какую версию gem вы используете? Если вы обновите gem до последней версии, вы получите ту же ошибку?

2. У Gemfile меня есть gem 'cloudinary' . И у Gemfile.lock меня есть cloudinary (1.2.4) @AleksandarKostadinov

3. Версия 1.2.4 драгоценного камня выпущена в октябре 2016 года, но ActiveStorage был добавлен только в 1.12.0, то есть с октября 2019 года. Я бы рекомендовал обновить до последней версии 1.18.1

4. @AleksandarKostadinov, спасибо! Я обновил Gemfile до gem ‘cloudinary’, ‘~> 1.18.1’ и теперь в Gemfile. блокировка У меня есть cloudinary (1.18.1), и теперь он работает. Теперь вы знаете, почему bundle устанавливал версию держателя?