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_name
、api_key
、api_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://***************
我已经为此挠头好一阵子了,似乎找不到解决办法。 总而言之,我正在开发一个仅用于培训的演示应用程序,我曾在其中提示用户上传一张照片。 我在 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_name
、api_key
、api_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://***************