Ruby on rails 获得;NoMethodError:未定义的方法“upload';对于nil:NilClass“;错误

Ruby on rails 获得;NoMethodError:未定义的方法“upload';对于nil:NilClass“;错误,ruby-on-rails,ruby,cloudinary,rails-activestorage,Ruby On Rails,Ruby,Cloudinary,Rails Activestorage,我正在开发一个在后端使用RubyonRails的android应用程序。我使用Rails创建了RESTAPI。我需要上传图像和其他数据。基本上,我有“user”和“Event”对象。每个用户都可以创建许多事件。用户可以随事件描述一起附加图像。我使用Postgres DB作为文本数据存储,它运行良好。但问题是,当我对图像使用cloudapi“Cloudinary”时。我不知道是什么问题。我得到以下错误: { "status": 500, "error": "Internal S

我正在开发一个在后端使用RubyonRails的android应用程序。我使用Rails创建了
RESTAPI
。我需要上传图像和其他数据。基本上,我有
“user”
“Event”
对象。每个用户都可以创建许多事件。用户可以随事件描述一起附加图像。我使用Postgres DB作为文本数据存储,它运行良好。但问题是,当我对
图像
使用cloudapi
“Cloudinary”
时。我不知道是什么问题。我得到以下错误:

  {
    "status": 500,
    "error": "Internal Server Error",
    "exception": "#<NoMethodError: undefined method `upload' for nil:NilClass>",
    "traces": {
        "Application Trace": [
            {
                "exception_object_id": 78590280,
                "id": 26,
                "trace": "app/controllers/events_controller.rb:23:in `create'"
            }
        ],
        "Framework Trace": [
            {
                "exception_object_id": 78590280,
                "id": 0,
                "trace": "activestorage (6.0.1) app/models/active_storage/blob.rb:194:in `upload_without_unfurling'"
            },
            {
                "exception_object_id": 78590280,
                "id": 1,
                "trace": "activestorage (6.0.1) lib/active_storage/attached/changes/create_one.rb:25:in `upload'"
            },.....
然后我跑:

bundle
rails active_storage:install
rails db:migrate
我在
config/storage.yml
中添加了以下内容:

    cloudinary:
  service: Cloudinary
  cloud_name: <%= ENV['CLOUDINARY_CLOUD_NAME'] %>
  api_key:    <%= ENV['CLOUDINARY_API_KEY'] %>
  api_secret: <%= ENV['CLOUDINARY_API_SECRET'] %>
Routes.rb loks如下所示:

Rails.application.routes.draw do
  resources :events do
    get :event_image, on: :member
  end
  resources :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
class EventsController < ApplicationController
  before_action :set_event, only: [:show, :update, :destroy]

  # GET /events
  def index
    @events = Event.all.with_attached_event_image

    render json: @events.map {|event|
    event.as_json.merge({event_image: url_for(event.event_image)})}
  end


  # GET /events/1
  def show
  event = Event.find(params[:id])
  render json: event.attributes.merge(event_image: url_for(event.event_image))

  end
  # POST /events
  def create
    @event = Event.new(event_params)
  #  Cloudinary::Uploader.upload(@event.event_image)
    if @event.save
      render json: @event, status: :created, location: @event
    else
      render json: @event.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /events/1
  def update
    if @event.update(event_params)
      render json: @event
    else
      render json: @event.errors, status: :unprocessable_entity
    end
  end

  # DELETE /events/1
  def destroy
     @event.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def event_params
      params.require(:event).permit(:title, :description, :country, :city, :event_location, :event_date, :event_time, :event_status, :user_id, :event_image)
    end
end
事件控制器
如下所示:

Rails.application.routes.draw do
  resources :events do
    get :event_image, on: :member
  end
  resources :users
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
class EventsController < ApplicationController
  before_action :set_event, only: [:show, :update, :destroy]

  # GET /events
  def index
    @events = Event.all.with_attached_event_image

    render json: @events.map {|event|
    event.as_json.merge({event_image: url_for(event.event_image)})}
  end


  # GET /events/1
  def show
  event = Event.find(params[:id])
  render json: event.attributes.merge(event_image: url_for(event.event_image))

  end
  # POST /events
  def create
    @event = Event.new(event_params)
  #  Cloudinary::Uploader.upload(@event.event_image)
    if @event.save
      render json: @event, status: :created, location: @event
    else
      render json: @event.errors, status: :unprocessable_entity
    end
  end

  # PATCH/PUT /events/1
  def update
    if @event.update(event_params)
      render json: @event
    else
      render json: @event.errors, status: :unprocessable_entity
    end
  end

  # DELETE /events/1
  def destroy
     @event.destroy
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_event
      @event = Event.find(params[:id])
    end

    # Only allow a trusted parameter "white list" through.
    def event_params
      params.require(:event).permit(:title, :description, :country, :city, :event_location, :event_date, :event_time, :event_status, :user_id, :event_image)
    end
end
类事件控制器

请记住:使用本地存储,API工作得很好!错误是当我将存储服务切换到
:cloudinary
时。有人能帮忙吗?

event.rb是什么样子?@JoshBrody event.rb如下:
class event
Cloudinary最近在Cloudinary gem中发布了官方的ActiveStorage支持。我会建议专门使用它,而不是任何第三方gems。@Aleksandar Kostadinov我已经尝试过了,但对我来说不起作用。我换成了卡里尔瓦夫。它与Carrierwave配合使用效果很好。谢谢你的帮助