代码之家  ›  专栏  ›  技术社区  ›  Virus

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

  •  0
  • Virus  · 技术社区  · 10 年前

    我的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/commands non-livrees/opers/52d3e7622c1bb94852000009/users/52dd20d52c1bb96e6800000d/save_reply” 用于2014年2月28日15:01:01+0100的127.0.0.1

    由UsersController#save_reply作为HTML进行处理

    参数:{“utf8”=>“”, “真实性_token”=>“QHTxNr27NMBsbND66Rfwde/cPMV06d9T6WEIjIPagc=”, “过滤器名称”=>“”,“filter_type”=>“with_profile”, “用户”=>{“reply_attributes”=>{“state”=<“Remexchangement effectu”, “赎回金额”=>“768”,“赎回日期(3i)”=>"24", “赎回日期(2i)”=>“2”,“赎回日期(1i)”=>"2014", “redemption_prof”=>#>, “注释”=>“测试注释”,“id”=>“530b6c4b2c1b9cc5e000008”}}, “提交”=>“验证程序”, “classaction_id”=>“命令非居住者”, “opponent_id”=>“52d3e7622c1bb94852000009”, “id”=>“52dd20d52c1bb96e6800000d”}

    轻便摩托车:127.0.0.1:27017更新
    database=class_actions_development collection=classactions 选择器={“_id”=>“52d3e7622c1bb94852000008”} update={“$set”=>{“对手.0.users.12.updated_at”=<2014-02-28 14:01:01 UTC时, “对手.0.users.12.回复.readmission_prof_file_name”=>“barbuk.jpg”, “counters.0.users.12.reply.redemption_prof_content_type”=>“image/jpeg”, “对手.0.users.12.回复.赎回_文件_大小”=>117083, “对手.0.users.12.回复.赎回_ of_updated_at”=>2014-02-28 14:01:01 UTC,“对手.0.users.12.回复注释”=>“测试注释”}} flags=[](0.1080ms)

    下面是我在数据库中的文档“user”:

    “reply”:{“_id”:ObjectId(“530b6c4b2c1bb9cc5e000008”),“note”: “测试注释”,“赎回金额”:“768”,“兑换日期”: ISO日期(“2014-02-24T00:00:00Z”),“赎回日期(1i)”:“2014”, “赎回日期(2i)”:“2”,“赎回日期”(3i):“24”, “redemption_prof_content_type”:“image/jpeg”, “redemption_prof_file_name”:“barbuk.jpg”, “redemption_prof_file_size”:117083,“redemption _prof_updated_at” :ISODate(“2014-02-28T14:01:1.646Z”),“state”:“Remexchangement” 效应“}

    同样,上传时Heroku上的日志:

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

    谢谢你的帮助!我希望这个案子能帮到某人。。。

    1 回复  |  直到 10 年前
        1
  •  0
  •   Richard Peck    10 年前

    也许这就是问题所在:

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

    我强烈建议设置 s3 您的凭据 ENV 变量,最好使用 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