0

編集: 以下の問題は、次のように s3 資格情報を Paperclip モデル (アセット) に直接含めることで解決されました。

 :s3_credentials => { :access_key_id     => 'AAAAAAAAAOKSSISVNQ', 
                       :secret_access_key => 'AAAAAAAAAAAAAAAAAAA1eWYh0au8Pg4bOnAmmX' ,
                       :bucket => 'my_bucket_name' },

イメージを S3 にアップロードするときに、新しい問題が発生するようになりました: ** AWS::Core::Client::NetworkError ** app/controllers/users/registrations_controller.rb:9:in `update'

これは、S3 バケットにアップロードしようとしている Rails サーバーを備えたローカルの Windows 7 マシンで発生します。


元の問題:

ペーパークリップを使用して複数の画像 (アセット) をアップロードし、コントローラーの更新アクションでユーザー モデルと共に保存しようとしています。このペーパークリップ S3 チュートリアルに従いました: http://webtempest.com/how-to-allow-image-uploads-in-rails-on-heroku/

Paperclip でこの正確なエラーについて 10 ほどの異なる回答を見つけましたが、どれも私の問題を解決しませんでした。

アセット モデルから S3 構成行をコメント アウトすると、エラーはなくなります。

私の registration_controller の更新アクションでエラーが発生します。

**undefined method `stringify_keys' for #<String:0x2a522d8>
    app/controllers/users/registrations_controller.rb:8:in `update'**

    {"utf8"=>"✓",
     "_method"=>"put",
     "authenticity_token"=>"ACFzngW4IXpuUDXutwHDCbpCuTjx2sFrZpcwBqt31LU=",
     "user"=>{"nickname"=>"newuser1",
     "first_name"=>"111",
     "last_name"=>"222",
     "birth_date"=>"2012-01-01 00:00:00.000000",
     "email"=>"my_email@gmail.com",
     "assets_attributes"=>{"0"=>{"asset"=>#<ActionDispatch::Http::UploadedFile:0x2a97a70 @original_filename="CIMG6275.JPG",
     @content_type="image/jpeg",
     @headers="Content-Disposition: form-data; name=\"user[assets_attributes][0][asset]\"; <br/>filename=\"CIMG6275.JPG\"\r\nContent-Type: image/jpeg\r\n",
     @tempfile=#<File:C:/Users/AA/AppData/Local/Temp/RackMultipart20120905-7504-7sivk1>>}},
     "instrument_ids"=>["1",
     "2",
     "3"],
     "id"=>"9"},
     "commit"=>"Update"}

ここで重要な User モデルの部分:

    class User < ActiveRecord::Base
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :trackable, :validatable 
      attr_accessible :id, :email, :password, :password_confirmation, :remember_me, 
           first_name, :last_name, :birth_date, :nickname, :instrument_ids, :assets,:assets_attributes 

      has_many :assets

      accepts_nested_attributes_for :assets, :allow_destroy => true
      ...

資産モデル (これは添付のクリップ オブジェクトです):

    class Asset < ActiveRecord::Base
      belongs_to :user
      has_attached_file :asset, 
    :whiny => false, 
          :styles => { :large=>"640x480g", :medium => "300x300>", :thumb => "100x100>" },
          :storage => :s3,
          :s3_credentials => "#{Rails.root}/config/s3.yml",
          :path => ":attachment/:id/:style.:extension",
          :bucket => 'name_of_my_bucket'
    end

私のコントローラー更新コード:

    class Users::RegistrationsController < Devise::RegistrationsController
      public 
      def update
        params[:user][:instrument_ids] ||= []
        @user = User.find(params[:user][:id])   
         if @user.update_without_password(params[:user])   
            respond_to do |format|
              format.html { redirect_to root_path }
              format.xml  { head :ok }
            end
          else
            respond_to do |format|
              format.html { render :action => "edit", :layout => "dialog" }
              format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
            end
          end
      end
      ...

重要なユーザー ビューの部分:

    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :multipart => true }) do |f| %> 
      <%= devise_error_messages! %>
        <% counter = 1 %>
        <%= f.fields_for :assets do |asset_fields| %>
            <% if asset_fields.object.new_record? %>
                <%= f.label "Image #{counter}" %>
                <% counter = counter + 1 %>
                <%= asset_fields.file_field :asset %>
                <%= asset_fields.label :asset_file_name %>
            <% end %>
        <% end %>

schema.rb ファイルの Asset モデル:

     create_table "assets", :force =&gt; true do |t|
        t.string   "asset_file_name"
        t.string   "asset_content_type"
        t.integer  "asset_file_size"
        t.datetime "asset_updated_at"
        t.integer  "user_id"
        t.datetime "created_at",         :null =&gt; false
        t.datetime "updated_at",         :null =&gt; false
      end

そして最後に、gemfile の一部:

    gem 'jquery-rails'
    gem 'aws-s3'
    gem 'aws-sdk'
    gem 'devise'
    gem 'cancan'
    gem 'omniauth-facebook'
    gem 'omniauth'
    gem 'roo'
    gem 'client_side_validations'
    gem 'sqlite3'
    gem 'nifty-generators'
    gem 'paperclip'



s3.yml: access_key_id: AKUAJO4RGQ4TKSSIQVNB
secret_access_key: UGiDBv2rohLJdIHNSQK3N1eWYh0au8Pg4bOnAxxY
バケット: my_bucket_name

セキュリティ上の目的で、上記のいくつかの文字を変更しました

前もって感謝します、アレックス

4

1 に答える 1

0

s3.yml で適切な環境を定義する必要があるようです

次の s3.yml ファイルを編集します。

access_key_id: AKUAJO4RGQ4TKSSIQVNB 
secret_access_key: UGiDBv2rohLJdIHNSQK3N1eWYh0au8Pg4bOnAxxY
bucket: my_bucket_name

に:

development:
  access_key_id: AKUAJO4RGQ4TKSSIQVNB 
  secret_access_key: UGiDBv2rohLJdIHNSQK3N1eWYh0au8Pg4bOnAxxY
  bucket: my_bucket_name


production:
  access_key_id: AKUAJO4RGQ4TKSSIQVNB 
  secret_access_key: UGiDBv2rohLJdIHNSQK3N1eWYh0au8Pg4bOnAxxY
  bucket: my_bucket_name
于 2012-09-05T14:40:39.743 に答える