#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)
@AleksandarKostadinov3. Версия 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 устанавливал версию держателя?