ruby-on-rails - Carrierwave Cloudinary 图像上传有效,但上传后立即返回空值

标签 ruby-on-rails carrierwave image-uploading cdn cloudinary

首先,我要说 - Cloudinary 和 Carrierwave 都很棒。 Carrierwave,超简单的图片上传。

Cloudinary 提供 10GB 存储空间的免费套餐,非常慷慨。

我的问题

我基本上是用 Carrierwave 测试 Cloudinary。

我让它们都可以工作,因为当我使用 Mac 上的 Postman 应用程序使用图像文件附件创建新用户(或更新现有用户)时,图像实际上确实保存在 Cloudinary CDN 上,并且之后我的数据库中的 URL 值,但 avatar 的 JSON 响应值为 null:

Postman screenshot

您可以在返回的响应中看到的问题,avatar 字段全部包含 null 值。

但是,当我在浏览器中查看 UsersControllerindex 操作时,会显示 avatar 值:

JSON response

有什么想法可能导致此问题吗?

是否是在创建/更新User实体时,Cloudinary尚未及时完成信息上传,因此Carrierwave将值保存为null,稍后,当Cloudinary处理完成后,它会回调 Carrierwave 来更新值吗?

我没有做任何花哨的事情,只是基本代码:

用户 Controller

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 方面的错误。

有人遇到过这个问题吗?

最佳答案

嗯...好吧,我想我找到了解决方案/解决方法?

也许一些 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

似乎是一个可能影响系统性能的额外步骤。

我不需要这样做,对吗?

关于ruby-on-rails - Carrierwave Cloudinary 图像上传有效,但上传后立即返回空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46271081/

相关文章:

javascript - NodeJS/强大的 : secure the backend for images upload

javascript - 图像上传和预览选项,代码不允许显示不同的图像

ruby-on-rails - 如何在rails api中使用devise-jwt和devise进行登录、注册和注销

ruby-on-rails - 不能包含 ActiveModel::Model

ruby-on-rails - Carrierwave 文件名在 update_attributes 上不断变化

ruby-on-rails - 图片上传后压缩

ruby-on-rails - ruby on rails id 没有保存

ruby-on-rails - 是否有针对 “Could not find *gem* in any of the sources”错误的修复程序,该修复程序不涉及删除Gemfile.lock?

carrierwave - 无法运行多个载波进程

c# - 将 Base64 格式的图像发送到 IIS 服务器(托管基于 C#.net 的 Web 处理程序)