Rails、Heroku、Cloudinary:尽管在本地工作,但生产中的照片未上传到 cloudinary

Rails, Heroku, Cloudinary: Photos not uploading to cloudinary in production, although working locally

我已经为此挠头好一阵子了,似乎找不到解决办法。 总而言之,我正在开发一个仅用于培训的演示应用程序,我曾在其中提示用户上传一张照片。 我在 rails 中使用 simple_form,并使用 cloudinary 来托管照片。在我的本地主机上一切正常,但应用程序在生产中中断,照片应该立即显示。原因是它们显然永远不会上传,我找不到原因。 我将尝试分享与该问题相关的所有内容:

1/ 首先,我在 .env 文件中添加了我的 cloudinary 密钥:

CLOUDINARY_URL=cloudinary://298522699261255:Qa1ZfO4syfbOC-***********************8

2/ 我在 gemfile 中添加了以下 gem:

gem 'cloudinary', '~> 1.12.0'
gem 'dotenv-rails', groups: [:development, :test]

而且我看到这是在 gemfile.lock 文件中添加的:

    cloudinary (1.12.0)
      aws_cf_signer
      rest-client

3/ 在 .gitignore 文件中添加:

.env*

4/ 我在 config/environments/development.rb 和 production.rb 文件中添加了这个:

config.active_storage.service = :cloudinary

5/ 在 config/storage.yml 文件中添加了这一行

cloudinary:
  service: Cloudinary

6/ 这是我的模特:

class Cocktail < ApplicationRecord
  has_many :doses, dependent: :destroy
  has_many :ingredients, through: :doses
  has_one_attached :photo

  validates :name, presence: true, uniqueness: true
end

7/ 我的控制器:

class CocktailsController < ApplicationController
  def index
    @cocktails = Cocktail.all
  end

  def show
    @cocktail = Cocktail.find(params[:id])
  end

  def new
    @cocktail = Cocktail.new
  end

  def create
    @cocktail = Cocktail.new(cocktail_params)
    if @cocktail.save
      redirect_to cocktail_path(@cocktail.id)
    else
      render :new
    end
  end

  private

  def cocktail_params
    params.require(:cocktail).permit(:name, :photo)
  end
end

8/ 这是我的 simple_form 提示用户添加照片的地方:

<h1>Create your Cocktail</h1>

<%= simple_form_for(@cocktail) do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="form-inputs">
    <%= f.input :name %>
  </div>
    <%= f.input :photo %>
  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

<%= link_to "Back to Cocktails", cocktails_path %>

9/ 这是显示图片的地方(也是应用程序中断的地方,因为图片还没有上传到 Cloudinary)

<div class="container">
  <div class="row">
    <% @cocktails.each do |cocktail| %>
      <div class="col-4">
        <div class="container d-flex justify-content-between">
          <div class="card-trip">
              <%= cl_image_tag cocktail.photo.key, crop: :fill %>
            <div class="card-trip-infos">
              <div>
                <h2><%= link_to cocktail.name, cocktail_path(cocktail) %></h2>
              </div>
              <h2 class="card-trip-pricing"><%=  %></h2>
            </div>
          </div>
        </div>
      </div>
    <% end %>
  </div>
</div>

如果我忘记了什么,让我知道我会添加它。

此应用程序在本地运行良好。但是一旦推送到 Heroku,该应用程序在其他情况下运行良好,但当用户返回到应该显示图片的索引页面时就会中断。可能的原因是图片没有上传到 Cloudinary,所以找不到。 所以我的问题是,为什么当我在本地测试应用程序而不是在 Heroku 上生产时,文件会上传到 Cloudinary?肯定有一些我想念的东西。 一点帮助将不胜感激! 谢谢!

您是否在 Heroku 上安装了插件?

$ heroku addons:create cloudinary

您是否向 Heroku 提供了 API 密钥和密钥? (配置变量)

Cloudinary 配置参数(cloud_nameapi_keyapi_secret)是通过 CLOUDINARY_URL 配置变量定义的。

确定;

config/storage.yml

云端: 服务:Cloudinary

config/environments/development.rb

config.active_storage.service = :cloudinary

config/environments/production.rb

config.active_storage.service = :cloudinary

heroku config:set CLOUDINARY_URL=cloudinary://***************