Rails 3.1 : 使用 PaperClip / Mongoid / SimpleForm < 在 AWS S3 上上传文件 -- 嵌套表单



我的web应用程序出现问题。我在AWS S3上上传的所有文件都能正常工作,但在下面的表格中,文件正确地保存在数据库中,但没有保存在S3上。

表单代码(views/users/show.html.haml):

= simple_nested_form_for @user, :url => save_reply_classaction_opponent_user_path(@classaction, @user.opponent, @user), :html => {:multipart => true} do |f|
= f.simple_fields_for :reply, @reply do |builder|
= hidden_field_tag :filter_name, @filter_name
= hidden_field_tag :filter_type, @filter_type
%dt= builder.label "Statut", required: false
%dd= builder.input :state, as: :select, label: false, collection: ["Remboursement effectué", "Demande de remboursement acceptée / En cours", "Remboursement partiel", "Demande rejetée"], include_blank: false
%dt= builder.label "Montant du remboursement", required: false
%dd= builder.input :redemption_amount, :placeholder => "Montant en euros", as: :string, label: false
%dt= builder.label "Date du remboursement", required: false
%dd= builder.input :redemption_date, as: :date, start_year: Time.now.year, end_year: Time.now.year-5, discard_day: false, order: [:day, :month, :year], label: false
%dt= builder.label "Justificatif", required: false
%dd= builder.input :redemption_proof, as: :file, label: false
- unless @reply.redemption_proof_file_name.nil?
%dd= link_to(@reply.redemption_proof_file_name, @reply.redemption_proof.url, :target => "_blank")
%dt= builder.label "Commentaires", required: false
%dd= builder.input :note, as: :text, label: false
.clearfix
= f.submit "Valider la réponse", :class => "le-button button-2"

模型"回复"代码(models/Reply.rb):

# encoding: utf-8
class Reply
include Mongoid::Document
include Mongoid::Timestamps
include Mongoid::Paperclip
include Mongoid::MultiParameterAttributes
field :state, type: String
field :redemption_amount
field :redemption_date, type: Date
field :note, type: String
has_mongoid_attached_file :redemption_proof,
:storage => :s3,
:path => "/redemption_proofs/:hash.:extension",
:hash_secret => "jojgHojKbjspvuufRsey78jkHj278",
:s3_credentials => File.join(Rails.root, 'config', 's3.yml')
embedded_in :user, inverse_of: :reply
end

模型"用户"代码(models/User.rb):

# encoding: utf-8
class User
include Mongoid::Document
include Mongoid::Timestamps
field :first_name
field :last_name
field :email
field :token
field :disabled_at, type: DateTime
embedded_in   :opponent, :inverse_of => :users
embeds_one    :reply
accepts_nested_attributes_for :reply
end

用户控制器(controller/users_controller.rb):

def show
if @user.reply.nil?
@reply = @user.build_reply
else
@reply = @user.reply
end
end
def save_reply
@filter_name = params[:filter_name]
@filter_type = params[:filter_type]
if @user.update_attributes(params[:user])
redirect_to classaction_opponent_user_path(@classaction, @opponent, @user, :moderation => '1', :filter_name => @filter_name, :filter_type => @filter_type)
end
end

下面是我在表单验证后控制台中的内容:

已启动PUT"/action de groupe/命令非livrees/对手/52d3e7622c1bb94852000009/users/52dd20d52c1bb96e6800000d/save_reply"适用于127.0.0.1,2014-02-28 15:01:01+0100

用户处理控制器#save_reply为HTML

参数:{"utf8"=>"✓","authentity_token"=>"QHTxNr27NMBsbND66Rfwde/cPMV06d9T6WEijIPagc=","filter_name"=>","filter_type"=>"with_profile","user"=>"reply_attributes"=>"state"=>"Remexchangement effect ué","redemption_amount"=>"768","redemption _date(3i)"=>"24","赎回日期(2i)"=>"2","赎回日期"=>"2014","赎回_prof"=>,"note"=>"test commentaire","id"=>"530b6c4b2c1bb9cc5e000008"},"commit"=>"验证响应","classaction_id"=>"命令非生存空间","opponent_id"=>"52d3e7622c1bb94852000009","id"=>"52dd20d52c1bb96e6800000d"}

MOPED:127.0.0.1:27017更新
数据库=class_actions_development集合=classactions选择器={"_id"=>"52d3e7622c1bb94852000008"}update={"$set"=>{"对手.0.users.12updated_at"=>2014-02-2814:01:01 UTC,"对手.0.用户.12.回复.赎回_prof_file_name"=>"barbuk.jpg","对手。0.users.12.respotion_prof_content_type"=>"image/jpeg","对手.0.用户.12.回复.赎回_prof_file_size"=>117083,"对手.0.用户.12.回复.赎回_prof_updated_at"=>2014-02-2814:01:01 UTC,"对手。0.用户。12.回复。注意"=>"测试评论"}}flags=[](0.1080ms)

下面是我在文档"用户"数据库中的信息:

"reply":{"_id":ObjectId("530b6c4b2c1bb9cc5e000008"),"note":"test commentaire"、"redemption_amount":"768"、"recemption_date":ISO日期("2014-02-24T00:00:00Z"),"赎回日期(1i)":"2014","赎回日期(2i)":"2","赎回日期":"24","redemption_prof_content_type":"image/jpeg","redemption_prof_file_name":"barbuk.jpg","redemption_prof_file_size":117083,"redemption _prof_updated_at":ISO日期("2014-02-28T14:01:1.646Z"),"state":"Remexchangement

同样,在上传时登录Heroku:

2014-02-27T13:31:43.810211+00:00应用程序[web.1]:[AWS S3 404 0.113370重试次数]head_object(:bucket_name=>"classactions_production",:key=>"redemption_profs/530cdb6074581998b500002a/original.jpg")AWS::S3::错误::NoSuchKey无此类密钥

感谢您的帮助!我希望这个案子能帮助到别人。。。

也许这可能是问题所在:

s3_credentials: File.join(Rails.root, 'config', 's3.yml')

我强烈建议您在ENV变量中设置s3凭据,最好使用Figaro gem:

#cmd
rails generate figaro:install
#config/application.yml
S3_ACCESS_KEY_ID: "your_key"
S3_SECRET_ACCESS_KEY: "your_key"
#app/models/image.rb
has_mongoid_attached_file :redemption_proof,
storage: :s3,
path: "/redemption_proofs/:hash.:extension",
has_secret: "jojgHojKbjspvuufRsey78jkHj278",
s3_credentials: {
access_key_id: ENV['S3_ACCESS_KEY_ID'],
secret_access_key: ENV['S3_SECRET_ACCESS_KEY']
}
#cmd
rake figaro:herkoku

最新更新