2009-11-07 9 views
8

Ich habe wirklich eine Wand getroffen und brauche Hilfe! Danke, dass Sie so weit gelesen haben!Upload auf Ruby on Rails vom iPhone mit ASIHTTPRequest

Ich bin gerade dabei, eine App zu schreiben, die mit meinem ROR-Webserver nach Datenbankanfragen redet und dank ActiveResource super funktioniert. Aber ich muss jetzt auch Dateien auf den Server hochladen, und ich habe vor, ASIHTTPRequest zu verwenden, das gut aussieht. Mein Problem ist jedoch, dass ich nicht sicher bin, wie ich die POST-Anfrage auf der ROR-Seite abliefern soll ... Ich benutze Büroklammer aber habe wirklich eine Mauer getroffen.

Auf der ASIHTTP Seite ich einfach ich schreibe:

[request setData:data withFileName:@"photo.jpg" andContentType:@"image/jpeg" forKey:@"asset[image]"]; 

und auf der Seite Rubin ich tue ...

class Asset < ActiveRecord::Base 
    validates_attachment_presence :image 
    has_attached_file :image 
end 

class AssetsController < ApplicationController 
    protect_from_forgery :only => [:update, :destroy] 
..... 

aber es funktioniert nicht immer, ich bin ziemlich sicher, Es hat etwas mit dem POST-Formular-Datensatz zu tun, aber ich bin völlig festgefahren.

Ich erhalte die Fehlermeldung:

Parameters: {"assets"=>{"images"=>#<File:/var/folders/gM/gM15qjM2G3W0iVNaT1evD++++TI/-Tmp-/RackMultipart20091112-2285-2i0qq5-0>}} 

NoMethodError (You have a nil object when you didn't expect it! 
You might have expected an instance of ActiveRecord::Base. 
The error occurred while evaluating nil.[]): 
    app/models/asset.rb:2 
    app/controllers/assets_controller.rb:46:in 

`create'

Jede Hilfe sehr sehr dankbar empfangen werden würde.

Chris

Vielen Dank!

Antwort

1

Das erste, was ich mit dem Hochladen überprüfen würde, ist das Setzen des Parameternamens auf was file_column (oder was auch immer, persönlich würde ich Paperclip verwenden) erwarten.

Wenn Sie so etwas wie:

class Entry < ActiveRecord::Base 
    file_column :image 
end 

Sie werden sicher, dass der Parameter (Formularfeldname) vornehmen müssen entspricht dem, was erwartet wird. Für das obige Beispiel wäre dies:

name="entry[image]" 

Also, stellen Sie sicher, dass Sie eine mehrteilige Form Post tun, nicht nur der Standard.

+1

Ich fand auch, dass Sie [Anfrage setPostValue: @ "Create" forKey: @ "commit"]; – Chris