我正在编写一个用户可以上传图像的rails应用程序。我正在使用Heroku部署,并使用Carrierwave和S3上传和存储图像。我已逐步遵循此heroku guide ...不幸的是,我仍然收到错误"未定义的方法`presigned_post'",并且不知道如何解决它。似乎S3_BUCKET没有被识别为aws对象......
有没有人遇到过这个问题并想出来了?这里有一些代码供参考:
图片控制器:
class PicturesController < ApplicationController
before_action :set_s3_direct_post, only: [:new, :create]
def index
@pictures = Picture.all
end
def new
@pictures = Picture.all
@picture = Picture.new
end
def create
@picture = Picture.new(picture_params)
if @picture.save
redirect_to new_picture_path, notice: "You just uploaded a picture!"
else
render "new"
end
end
...
def picture_params
params.require(:picture).permit(:attachment)
end
private
def set_s3_direct_post
@s3_direct_post = S3_BUCKET.presigned_post(key: "uploads/#{SecureRandom.uuid}/${filename}", success_action_status: '201', acl: 'public-read')
end
end
&#13;
新图片视图:
<h1>Upload a new picture</h1>
<br>
<div class="well">
<%= form_for @picture, html: { class: 'directUpload', data: { 'form-data' => (@s3_direct_post.fields), 'url' => @s3_direct_post.url, 'host' => URI.parse(@s3_direct_post.url).host } } do |f| %>
<%= f.file_field :attachment %>
<%= f.submit "Upload", class: "btn btn-default" %>
<% end %>
</div>
&#13;
和config / environment.rb:
require File.expand_path('../application', __FILE__)
# Initialize the Rails application.
Rails.application.initialize!
# S3
S3_BUCKET='fotoes'
AWS_ACCESS_KEY_ID='secretxxxxxxxx'
AWS_SECRET_ACCESS_KEY='xxxxxxxsecretxxxxxx'
&#13;
有什么想法吗?
答案 0 :(得分:0)
@Jillian我想你的期望是S3_BUCKET类应该调用presigned_post方法,该方法应该被定义。然而,它似乎不是。我看了一下包含你所遵循的教程的heroku页面,并且你遵循了每条指令。我建议你联系heroku了解文档。但是,我会继续研究它
答案 1 :(得分:0)
谢谢大家的帮助。最后,我发现了一个更简单有效的不同演练。 (Heroku一个有点复杂,并且留下了很多错误 - 去图。)
This解决了所有问题:)
编辑:
不是一切 - 在我运行网站之前必须完成最后一步。在终端中运行此行:$ heroku config:添加AWS_ACCESS_KEY = value 和$ heroku config:添加AWS_SECRET_KEY = value,其中值分别是每个的S3凭据。
这是雾,载波,轨道,雾霾宝石的唯一组合(经过几周的骚动):
gem'trail','4.1.0'
gem'carrierwave','〜&gt; 0.10.0'
宝石'迷雾','1.34.0'
gem'flow-aws','0.7.6'
答案 2 :(得分:0)
我通过更新我的aws-sdk版本来解决这个问题
User C