0

私のレール3.2.1アプリでは、マシンからファイルをアップロードしようとすると、ブラウザでこのエラーが発生します。

NoMethodError in AssetsController#create

undefined method `symbolize_keys' for #<String:0x00000104200ad0>
app/controllers/assets_controller.rb:53:in `block in create'
app/controllers/assets_controller.rb:52:in `create

これは、私の開発マシンで実行されているレール シン サーバーの出力です。

Rendered assets/new.html.erb within layouts/application (5.8ms)
Completed 200 OK in 104ms (Views: 101.2ms | ActiveRecord: 0.5ms)


Started POST "/assets" for 127.0.0.1 at 2012-06-17 16:18:03 -0700
Served asset  - 404 Not Found (7ms)
Processing by AssetsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"XXXX=", "asset"=>{"user_id"=>"1",   "uploaded_file"=>#<ActionDispatch::Http::UploadedFile:0x0000010430e080 @original_filename="41382-450x-e_37.jpeg", @content_type="image/jpeg", @headers="Content- Disposition: form-data; name=\"asset[uploaded_file]\"; filename=\"41382-450x-e_37.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/P+/P+AVMPNFEyO8F-xz7UfIP++++TI/-Tmp-/RackMultipart20120617-19438-1y1fya5>>}, "commit"=>"Create Asset"}

User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
 (0.2ms)  BEGIN
SQL (0.5ms)  INSERT INTO "assets" ("created_at", "updated_at",     "uploaded_file_content_type", "uploaded_file_file_name", "uploaded_file_file_size",   "uploaded_file_updated_at", "user_id") 
VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"    [["created_at", Sun, 17 Jun 2012  23:18:03 UTC +00:00], 

["updated_at", Sun, 17 Jun 2012  23:18:03 UTC +00:00], ["uploaded_file_content_type",   "image/jpeg"], ["uploaded_file_file_name", "41382-450x-e_37.jpeg"],     

["uploaded_file_file_size", 36549], ["uploaded_file_updated_at", Sun, 17 Jun 2012  23:18:03 UTC +00:00], ["user_id", 1]]
[paperclip] Saving attachments.
[paperclip] saving assets/23/41382-450x-e_37.jpeg
 (0.1ms)  ROLLBACK

Completed 500 Internal Server Error in 7ms

NoMethodError (undefined method `symbolize_keys' for #<String:0x00000104200ad0>):
app/controllers/assets_controller.rb:53:in `block in create'
app/controllers/assets_controller.rb:52:in `create'

Assets コントローラーの create メソッドは次のようになります。

# POST /assets
# POST /assets.json
def create
 @asset = current_user.assets.new(params[:asset])

 respond_to do |format|
   if @asset.save
     format.html { redirect_to @asset, notice: 'Asset was successfully created.' }
     format.json { render json: @asset, status: :created, location: @asset }
   else
     format.html { render action: "new" }
     format.json { render json: @asset.errors, status: :unprocessable_entity }
   end
 end

終わり

何が起こっているのでしょうか?フィードバックをいただければ幸いです。

ありがとう


編集:このチュートリアルに従って、AWS gem を使用してファイルを amazon s3 にアップロードしています。アプリの config/s3_credentials.yml にこの構成ファイルがあり、Amazon s3 資格情報が含まれています。

私のasset.rbファイルでこのコードを使用しています:

 has_attached_file :uploaded_file,
                :path => "assets/:id/:basename.:extension",
                :storage => :s3,
                :s3_credentials => "#{Rails.root}/config/s3_credentials.yml",
                :bucket => "XXXX"

これは、ビューによって呼び出される私の _form です。

<%= simple_form_for @asset, :html=> { :multipart => true}  do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
  <%= f.label :UserID %>
  <%= f.input :user_id %>
 </div>
 <div class="form-inputs">
<%= f.label :uploaded_file, "File" %>
    <%= f.file_field :uploaded_file %>
 </div>
<div class="form-actions">
 <%= f.button :submit %>
</div>
<% end %>

s3_credential.yml ファイル

development:
  access_key_id:"XXXXXXXXXX"
  secret_access_key:"XXXXXXXXXXXXXXXXXXXX"

production:
  access_key_id:"XXXXXXXXXX"
  secret_access_key:"lG/XXXXXXXXXXXXXXXXXXXX"
4

2 に答える 2

1

@assetコントローラーに渡した文字列から作成しようとしているようです。Rails は hashwithindifferentaccess を想定しており、symbolize_keys を呼び出します。

于 2012-06-17T23:43:29.067 に答える
0

これは、String 型にはsymbolize_keysメソッドがないためです。このメソッドは、ハッシュ タイプのみからのものです。

于 2012-06-17T23:29:58.450 に答える