Carrierwave Cloudinary 图像上传有效,但上传后立即返回空值
Carrierwave Cloudinary image upload works but null values returned right after upload
首先,让我说 - Cloudinary 和 Carrierwave 都很棒。 Carrierwave,超简单的图片上传。
Cloudinary 提供 10GB 存储空间的免费计划,非常慷慨。
我的问题
我基本上是在用 Carrierwave 测试 Cloudinary。
从某种意义上说,当我使用 Mac 上的 Postman 应用程序创建一个带有图像文件附件的新用户(或更新现有用户)时,我已经让它们都起作用了,图像实际上确实得到了保存在 Cloudinary CDN 上,之后 URL 值保存在我的数据库中,但 avatar
的 JSON 响应值为空:
您可以在返回的响应中看到问题,avatar
字段都包含 null
个值。
但是,当我在浏览器中查看 UsersController
的 index
操作时,显示 avatar
值:
知道是什么导致了这个问题吗?
会不会是当 User
实体是 created/updated 时,Cloudinary 还没有及时完成信息上传,所以 Carrierwave 将该值保存为 null,稍后,当Cloudinary 已完成处理,它会回调 Carrierwave 以更新值?
我没有做任何花哨的事情,只是基本代码:
用户控制器
class UsersController < ApplicationController
def index
users = User.all
render json: users
end
def create
user = User.new(user_params)
if user.save
render json: user, status: :created
else
render json: user.errors, status: :unprocessable_entity
end
end
def update
# simple test, change to params id later
user = User.where(id: 3)
if user.update(user_params)
render json: user, status: :ok
else
render json: user.errors, status: :unprocessable_entity
end
end
private
def user_params
params.permit(:id, :first_name, :last_name, :email, :password, :password_confirmation, :avatar)
end
end
Mac终端输出
Processing by UsersController#update as */*
Parameters: {"avatar"=>#<ActionDispatch::Http::UploadedFile:0x007fa39caad5b0 @tempfile=#<Tempfile:/var/folders/sk/tjj1jxkd62ngkhfxmh8yc04r0000gn/T/RackMultipart20170918-2307-lw2ga8.jpg>, @original_filename="doc.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"avatar\"; filename=\"doc.jpg\"\r\nContent-Type: image/jpeg\r\n">, "first_name"=>"Emmett", "last_name"=>"Brown", "id"=>"3"}
Can't verify CSRF token authenticity.
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? [["id", 3]]
(0.1ms) begin transaction
SQL (0.4ms) UPDATE "users" SET "first_name" = ?, "avatar" = ?, "updated_at" = ? WHERE "users"."id" = ? [["first_name", "Emmett"], ["avatar", "kzc9ghjln9gfoowhzudi.png"], ["updated_at", "2017-09-18 02:55:59.269637"], ["id", 3]]
SQL (0.1ms) UPDATE "users" SET "avatar" = 'image/upload/v1505703360/kzc9ghjln9gfoowhzudi.png' WHERE "users"."id" = ? [["id", 3]]
(2.7ms) commit transaction
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::JsonApi (3.52ms)
Completed 200 OK in 3259ms (Views: 14.9ms | ActiveRecord: 4.0ms)
希望这是我不知道的一些愚蠢的错误或快速配置选项,而不是 Carrierwave 或 Cloudinary 方面的错误。
有没有人遇到过这个问题?
嗯...好吧,我想我在附近找到了 solution/work?
也许某些 Rails 或 Carrierwave 开发人员可以向我解释为什么我需要这样做来解决问题:
def create
user = User.new(user_params)
if user.save
# -------------------------------------------------
# NEED TO RELOAD FOR CARRIERWAVE
# -------------------------------------------------
user.reload
render json: user, status: :created
else
render json: user.errors, status: :unprocessable_entity
end
end
似乎是一个会影响系统性能的额外步骤。
我不需要这样做吧?
首先,让我说 - Cloudinary 和 Carrierwave 都很棒。 Carrierwave,超简单的图片上传。
Cloudinary 提供 10GB 存储空间的免费计划,非常慷慨。
我的问题
我基本上是在用 Carrierwave 测试 Cloudinary。
从某种意义上说,当我使用 Mac 上的 Postman 应用程序创建一个带有图像文件附件的新用户(或更新现有用户)时,我已经让它们都起作用了,图像实际上确实得到了保存在 Cloudinary CDN 上,之后 URL 值保存在我的数据库中,但 avatar
的 JSON 响应值为空:
您可以在返回的响应中看到问题,avatar
字段都包含 null
个值。
但是,当我在浏览器中查看 UsersController
的 index
操作时,显示 avatar
值:
知道是什么导致了这个问题吗?
会不会是当 User
实体是 created/updated 时,Cloudinary 还没有及时完成信息上传,所以 Carrierwave 将该值保存为 null,稍后,当Cloudinary 已完成处理,它会回调 Carrierwave 以更新值?
我没有做任何花哨的事情,只是基本代码:
用户控制器
class UsersController < ApplicationController
def index
users = User.all
render json: users
end
def create
user = User.new(user_params)
if user.save
render json: user, status: :created
else
render json: user.errors, status: :unprocessable_entity
end
end
def update
# simple test, change to params id later
user = User.where(id: 3)
if user.update(user_params)
render json: user, status: :ok
else
render json: user.errors, status: :unprocessable_entity
end
end
private
def user_params
params.permit(:id, :first_name, :last_name, :email, :password, :password_confirmation, :avatar)
end
end
Mac终端输出
Processing by UsersController#update as */*
Parameters: {"avatar"=>#<ActionDispatch::Http::UploadedFile:0x007fa39caad5b0 @tempfile=#<Tempfile:/var/folders/sk/tjj1jxkd62ngkhfxmh8yc04r0000gn/T/RackMultipart20170918-2307-lw2ga8.jpg>, @original_filename="doc.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"avatar\"; filename=\"doc.jpg\"\r\nContent-Type: image/jpeg\r\n">, "first_name"=>"Emmett", "last_name"=>"Brown", "id"=>"3"}
Can't verify CSRF token authenticity.
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? [["id", 3]]
(0.1ms) begin transaction
SQL (0.4ms) UPDATE "users" SET "first_name" = ?, "avatar" = ?, "updated_at" = ? WHERE "users"."id" = ? [["first_name", "Emmett"], ["avatar", "kzc9ghjln9gfoowhzudi.png"], ["updated_at", "2017-09-18 02:55:59.269637"], ["id", 3]]
SQL (0.1ms) UPDATE "users" SET "avatar" = 'image/upload/v1505703360/kzc9ghjln9gfoowhzudi.png' WHERE "users"."id" = ? [["id", 3]]
(2.7ms) commit transaction
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::JsonApi (3.52ms)
Completed 200 OK in 3259ms (Views: 14.9ms | ActiveRecord: 4.0ms)
希望这是我不知道的一些愚蠢的错误或快速配置选项,而不是 Carrierwave 或 Cloudinary 方面的错误。
有没有人遇到过这个问题?
嗯...好吧,我想我在附近找到了 solution/work?
也许某些 Rails 或 Carrierwave 开发人员可以向我解释为什么我需要这样做来解决问题:
def create
user = User.new(user_params)
if user.save
# -------------------------------------------------
# NEED TO RELOAD FOR CARRIERWAVE
# -------------------------------------------------
user.reload
render json: user, status: :created
else
render json: user.errors, status: :unprocessable_entity
end
end
似乎是一个会影响系统性能的额外步骤。
我不需要这样做吧?