2014-03-02 37 views
0

我在我的web應用程序中遇到問題。我在AWS S3上的所有上傳工作,但在下面的表格中,該文件正確保存在數據庫中,但不保存在S3上。Rails 3.1:在AWS S3上使用PaperClip/Mongoid/SimpleForm上載文件< - 嵌套表格

形式代碼(視圖/用戶/ 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" 

模型 「回覆」 碼(型號/ 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 

用戶控制器(控制器/ 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 「/行動日-groupe/commandes-non-livrees/opponents/52d3e7622c1bb94852000009/users/52dd20d52c1bb96e6800000d/save_reply「 for 127.0.0.1 at 2014-02-28 15:01:01 +0100

處理由UsersController#save_reply作爲HTML

參數:{ 「UTF8」=> 「✓」, 「authenticity_token」=> 「QHTxNr27NMBsbND66Rfwde/cPMV06d9T6WEIjIPPagc =」, 「FILTER_NAME」=> 「」,「FILTER_TYPE 「=>」with_profile「, 」user「=> {」reply_attributes「=> {」state「=>」Remboursementeffectué「, 」redemption_amount「=>」768「,」redemption_date(3i)「=>」24 「, 」redemption_date(2i)「=>」2「,」redemption_date(1i)「=>」2014「, 」redemption_proof「=>#>, 」note「=>」test commentaire「,」id「 =>「530b6c4b2c1bb9cc5e000008」}}, 「commit」=>「Valider laréponse」, 「classaction_id」=>「comm安第斯山脈-非livrees」, 「opponent_id」=> 「52d3e7622c1bb94852000009」, 「ID」=> 「52dd20d52c1bb96e6800000d」}

MOPED:127.0.0.1:27017 UPDATE
數據庫= class_actions_development集合= classactions 選擇= {「_id」=>「52d3e7622c1bb94852000008」} update = {「$ set」=> {「opponents.0.users.12.updated_at」=> 2014-02-28 14:01:01 UTC, 「對手.0.users.12.reply.redemption_proof_file_name「=>」barbeuk.jpg「, 」opponents.0.users.12.reply.redemption_proof_content_type「=>」image/jpeg「, 」opponents.0.users.12 .reply.redemption_proof_file_size「=> 117083, 」對手.0.users.12.reply.redemption_proof_updated_at「=> 2014-02-28 14:01:01 UTC,」opponents.0.users.12.reply.note「=>」test commentaire「}} flags = [](0。1080ms)

下面這是我在數據庫中的文檔 「用戶」:

「答覆」:{ 「_id」:物件( 「530b6c4b2c1bb9cc5e000008」), 「注意」: 「redemption_date」:「732」,「redemption_date」: ISODate(「2014-02-24T00:00:00Z」 )「:」2「,」redemption_date(3i)「:」24「, 」redemption_proof_content_type「:」image/jpeg「, 」redemption_proof_file_name「:」barbeu k.jpg」, 「redemption_proof_file_size」:117083 「redemption_proof_updated_at」 :ISODate( 「2014-02-28T14:01:01.646Z」), 「狀態」: 「Remboursement effectué」}

太,在Heroku日誌而上傳:

2014-02-27T13:31:43.810211 + 00:00應用程式[web.1]:[AWS S3 404 0.11337 0 重試] head_object(: bucket_name =>「classactions_production」,:key =>「redemption_proofs/530cdb6074581998b500002a/original.jpg」) AWS :: S3 :: Errors :: NoSuchKey No such Key

感謝您的幫助!我希望這種情況會幫助別人......

回答

0

也許,這可能是問題:

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

我會強烈建議你ENV變量設置s3憑據,最好使用Figaro寶石:

#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 
+1

謝謝,這是一個很好的寶石,我注意到它! 但是,我在我的web應用程序上的S3上傳的所有內容都與我當前的配置一起工作,所以我認爲問題不在此處。 – Virus

+0

好的沒問題:) –

相關問題