Ruby on rails 如何通过carrierwave上传S3中的图像并将文件名保存在数据库中?
我尝试使用carrierwave和fog gem在s3中上传照片,但出现了错误Ruby on rails 如何通过carrierwave上传S3中的图像并将文件名保存在数据库中?,ruby-on-rails,ruby,upload,carrierwave,Ruby On Rails,Ruby,Upload,Carrierwave,我尝试使用carrierwave和fog gem在s3中上传照片,但出现了错误 未定义的方法为nil:NilClass捕获'。 行内:if@premium.save` 在控制器/操作中创建 def create @premium = Article.new(premium_params) @premium.created_date = Time.now if @premium.save redirect_to admincp_premium_path(@premium.id)
未定义的方法
为nil:NilClass捕获'。
行内:
if@premium.save`
在控制器/操作中创建
def create
@premium = Article.new(premium_params)
@premium.created_date = Time.now
if @premium.save
redirect_to admincp_premium_path(@premium.id)
else
respond_to do |format|
format.html { render :new }
format.json { render json: @premium.errors, status: :unprocessable_entity }
end
end
结束
这是我的代码:
carrierwave.rb
CarrierWave.configure do |config|
config.fog_credentials = {
:provider => 'AWS',
:aws_access_key_id => ENV['S3_KEY'],
:aws_secret_access_key => ENV['S3_SECRET'],
:region => ENV['S3_REGION'],
:path_style => true
}
config.cache_dir = "#{Rails.root}/tmp/uploads"
config.fog_directory = ENV['S3_BUCKET']
end
在文章_controller.rb中
def create
@premium = Article.new(premium_params)
@premium.created_date = Time.now
if @premium.save
redirect_to admincp_premium_path(@premium.id)
else
respond_to do |format|
format.html { render :new }
format.json { render json: @premium.errors, status: :unprocessable_entity }
end
end
结束`
在模型artcle.rb中
Class Article < ActiveRecord::Base
...
# set file upload image
mount_uploader :image, ImageUploader
end.
类文章
谢谢你救了我的命
错误日志:
Started POST "/admincp/premiums/new" for 127.0.0.1 at 2015-03-30 16:55:53 +0700
Processing by Admincp::PremiumsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"m38F1BDY50lGd/oueT4swpawWueiOBBgOT/MK7xHX4q9aGchBjEc1UnX8UEsTvE+rEz+F3Le9Ru1zVusx7W3dQ==", "premium"=>{"title"=>"rwe", "url"=>"wewe", "start_date"=>"01-03-2015", "end_date"=>"11-03-2015", "image"=>#<ActionDispatch::Http::UploadedFile:0x007fd1b8d97c90 @tempfile=#<Tempfile:/tmp/RackMultipart20150330-11636-1pd05hk.jpg>, @original_filename="canh-dep-tai-nha-trang.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"premium[image]\"; filename=\"canh-dep-tai-nha-trang.jpg\"\r\nContent-Type: image/jpeg\r\n">, "number"=>"10"}, "commit"=>"登録"}
(0.2ms) BEGIN
SQL (0.8ms) INSERT INTO `article` (`title`, `url`, `image`, `start_date`, `end_date`, `number`, `created_date`) VALUES ('rwe', 'wewe', '1d5f0c8e-c41e-4eda-a379-b1b51430372a.jpg', '2015-03-01 00:00:00.000000', '2015-03-11 00:00:00.000000', 10, '2015-03-30 09:55:53.363046')
[fog][WARNING] fog: followed redirect to s3.amazonaws.com, connecting to the matching region will be more performant
(549.1ms) ROLLBACK
Completed 500 Internal Server Error in 7494ms
NoMethodError (undefined method `captures' for nil:NilClass):
app/controllers/admincp/premiums_controller.rb:32:in `create'
于2015-03-30 16:55:53+0700为127.0.0.1开始发布“/admincp/premium/new”
Admincp处理::PremiumController#创建为HTML
参数:{“utf8”=>“✓", "真实性令牌“=>”m38F1BDY50lGd/oueT4swpawWueiOBBgOT/MK7xHX4q9aGchBjEc1UnX8UEsTvE+rEz+F3Le9Ru1zVusx7W3dQ=>”,“高级”=>{“标题”=>“rwe”,“url”=>“WEWEWE”,“开始日期”=>“01-03-2015”,“结束日期”=>“11-03-2015”,“图像”=>,“数字”=>“10”,“提交”=>”登録"}
(0.2ms)开始
SQL(0.8ms)插入到“文章”(“标题”、“url”、“图像”、“开始日期”、“结束日期”、“编号”、“创建日期”)中的值(“rwe”、“WEWEWE”、“1d5f0c8e-c41e-4eda-a379-b1b51430372a.jpg”、“2015-03-01 00:00.000000”、“2015-03-11 00:00:00.000000”、“10”、“2015-03-30 09:55:53.363046”)
[fog][警告]fog:随后重定向到s3.amazonaws.com,连接到匹配区域将更有效
(549.1ms)回滚
在7494ms内完成500个内部服务器错误
NoMethodError(未定义nil:NilClass的“捕获”方法):
app/controllers/admincp/premium\u controller.rb:32:in'create'
我也遇到了同样的问题。我可以通过调整我的CarrierWave配置中的:region
来解决这个问题
我使用S3的美国标准
区域作为我的存储桶,并且我设置了区域:“US-east-1”
,这是默认设置。当我以前在俄勒冈州设置区域时:“US-west-2”
起作用(该选项未在区域选项中列出)@Sontya.是的。我更新了它。您能在“app/controllers/admincp/premium\u controller.rb:32”处显示代码吗?此代码是“if@premium.save”,用于创建