Ruby on rails 获得;NoMethodError:未定义的方法“upload';对于nil:NilClass“;错误
我正在开发一个在后端使用RubyonRails的android应用程序。我使用Rails创建了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
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配合使用效果很好。谢谢你的帮助