使用carrierwave和fog将图片上传到S3的Rails实现方法

3
你好,我一直在开发一个网络应用程序,并希望让用户有可能上传个人资料照片。我花费了很多时间尝试使用CarrierWave和Fog与S3合作,但未能成功。如果您能给我任何帮助,我将非常感激。
更新: 我一直在试图调整它,从我的观察中可以得知文件从未上传,在用户控制器中的:image值始终为空。
我的上传器类。
class PhotoUploader < CarrierWave::Uploader::Base
   storage :fog
   def store_dir
      "uploads/#images/#{model.class.to_s.underscore}"
   end
end

雾化程序初始化器
CarrierWave.configure do |config| 
  config.fog_credentials = { 
    :provider               => 'AWS', 
    :aws_access_key_id      => 'xxx', 
    :aws_secret_access_key  => 'yyy', 
  } 
  config.fog_directory  = 'pictures_dev' 
  config.fog_public     = true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}
end 

用户模型
class User
  include Mongoid::Document
  ....
  has_one :photo
  ....
end

照片模型

class Photo
include Mongoid::Document
attr_accessible :name, :image

field :image, :type => String
field :name, :type => String

belongs_to :user

mount_uploader :image, PhotoUploader
 end

图片控制器

  class PhotoController < ApplicationController

    def update
    @photo = Photo.find(params[:id])
      if @photo.update_attributes(params[:image]) 
        flash[:success] = "Your have updated your settings successfully."
      else
        flash[:error] = "Sorry! We are unable to update your settings. Please check your      fields and try again."
    end
    redirect_to(:back)
   end

上传表单

= form_for @photo, :html => {:multipart => true} do |f|
  %p
    %label Photo
    = image_tag(@user.image_url) if @photo.image? 
    = f.file_field :image
    = f.submit

这是我能想到与此相关的全部内容,如果有人需要我发布更多的代码,我会很乐意。我真的感到困惑,任何帮助都将不胜感激。

你的日志里有没有任何错误? - Kyle C
你可能把S3存储桶放在了错误的区域? - Christopher Lindblom
Christopher,S3存储桶在正确的区域。Kyle,没有任何错误。图片只是从未上传。 - EnriqueC
你试过在 @photo = Photo.find(params[:id]) 之后直接加一个 debugger 停止语句,然后从 debugger 开始使用 irb 并手动尝试吗?也许这样可以找到问题所在。 - Christopher Lindblom
2个回答

2

0

我认为你遇到了问题

if @photo.update_attributes(params[:image])

可以尝试使用这个替代方案

if @photo.update_attributes(image: params[:photo][:image])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接