2010-07-14 86 views
0

我想向我的Ruby on Rails本地服務器發送POST請求。不幸的是,起初它不會讓我POST,因爲protect_from_forgery,所以我最終在開發和生產中將它設置爲false。基本上,我的問題是我將發送來自我的Cocoa應用程序的POST請求和所有想要的參數,Ruby服務器將會看到它。但是,每當服務器插入我的請求時,除created_at和updated_at之外,所有VALUES都設置爲NULL。我不知道Ruby on Rails是如何工作的(因爲我使用腳手架),所以我不確定需要設置哪些參數以便它們能夠正確插入。Ruby on Rails和Cocoa - POST將值作爲NULL放入數據庫

謝謝!

可可CODE:

NSString *urlString = @"http://localhost:3000/clients"; 
NSURL *url = [[NSURL alloc] initWithString:urlString]; 
NSMutableURLRequest *req = [[NSMutableURLRequest alloc] initWithURL: url]; 
[req setHTTPMethod: @"POST"]; 

NSData *putParams = [@"name=TEST&ip_address=1.1.1.1" dataUsingEncoding:NSUTF8StringEncoding]; 
[req setHTTPBody: putParams]; 

NSHTTPURLResponse* urlResponse = nil; 
NSError *error = [[NSError alloc] init]; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:req returningResponse:&urlResponse error:&error]; 
NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

NSLog(@"Response Code: %d", [urlResponse statusCode]); 
if ([urlResponse statusCode] >= 200 && [urlResponse statusCode] < 300) 
    NSLog(@"Response: %@", result); 

[url release]; 
[req release]; 
[error release]; 

服務器響應:

Processing ClientsController#create (for 17.224.23.62 at 2010-07-13 16:59:55) [POST] 
Parameters: {"name"=>"TEST", "ip_address"=>"1.1.1.1"} 
Client Create (0.3ms) INSERT INTO "clients" ("name", "created_at", "updated_at", "ip_address") VALUES(NULL, '2010-07-13 23:59:55', '2010-07-13 23:59:55', NULL) 
Redirected to http://17.224.23.62:3000/clients/6 
Completed in 7ms (DB: 0) | 302 Found [http://17.224.23.62/clients] 

Processing ClientsController#show (for 17.224.23.62 at 2010-07-13 16:59:55) [GET] 
Parameters: {"id"=>"6"} 
Client Load (0.1ms) SELECT * FROM "clients" WHERE ("clients"."id" = 6) 
Rendering template within layouts/clients 
Rendering clients/show 
Completed in 7ms (View: 2, DB: 0) | 200 OK [http://17.224.23.62/clients/6] 

我試圖做這CLIENTS控制器,但問題仍然是相同的:

if params[:name].present? 
    @client = Client.new(:name => params[:names]) 
else 
    @client = Client.new(params[:client]) 
end 

JUST IN情況下,需要(完整的客戶端控制器 - 所有這些都與SCAFFOLD相關):

class ClientsController < ApplicationController 

# GET /clients 
# GET /clients.xml 
def index 
    @clients = Client.all 

    respond_to do |format| 
    format.html # index.html.erb 
    format.xml { render :xml => @clients } 
    end 
end 

# GET /clients/1 
# GET /clients/1.xml 
def show 
    @client = Client.find(params[:id]) 

    respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @client } 
    end 
end 

# GET /clients/new 
# GET /clients/new.xml 
def new 
    @client = Client.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @client } 
    end 
end 

# GET /clients/1/edit 
def edit 
    @client = Client.find(params[:id]) 
end 

# POST /clients 
# POST /clients.xml 
def create 
    if params[:name].present? 
    @client = Client.new(:name => params[:names]) 
    else 
    @client = Client.new(params[:client]) 
    end 

    respond_to do |format| 
    if @client.save 
     format.html { redirect_to(@client, :notice => 'Client was successfully created.') } 
     format.xml { render :xml => @client, :status => :created, :location => @client } 
    else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @client.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

# PUT /clients/1 
# PUT /clients/1.xml 
def update 
    @client = Client.find(params[:id]) 

    respond_to do |format| 
    if @client.update_attributes(params[:client]) 
     format.html { redirect_to(@client, :notice => 'Client was successfully updated.') } 
     format.xml { head :ok } 
    else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @client.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

# DELETE /clients/1 
# DELETE /clients/1.xml 
def destroy 
    @client = Client.find(params[:id]) 
    @client.destroy 

    respond_to do |format| 
    format.html { redirect_to(clients_url) } 
    format.xml { head :ok } 
    end 
end 

end 

P.S.如果我的問題有些不清楚,請告訴我。

+0

需要看到控制器和發佈請求才能看到這些工作是如何工作的 - 所以請在更新時加入。 – 2010-07-14 00:15:48

+0

你好傑米。我剛剛進行了更新。如果你能幫忙,我會很感激! – hassaanm 2010-07-14 00:26:43

回答

1

您的控制器中有錯字:@client = Client.new(:name => params[:names])應該是@client = Client.new(:name => params[:name])

這將解決問題的一部分,但這裏是它的根:

本質上說,如果這是一個「真實」的Rails應用程序,將派遣PARAMS這樣的:

{ :client => { :name => x, :ip => y } } 

然後像這樣:你可以訪問PARAMS名稱和IP [客戶]:

@client = Client.new(params[:client]) 

但你要發送:

{ :name => x, :ip => y } 

因此,你需要:

@client = Client.new(:name => params[:name], :ip => params[:ip]) 

對於 「Rails的方式」 工作,你可以修改你的Objective-C代碼發送PARAMS像client[name]=x&client[ip]=y

+0

哇!所以唯一的問題是,小名字錯誤...非常感謝你捕捉它!我改變它的名字,它的工作!順便說一句,我不需要在Objective-C代碼中做任何改變。再一次,謝謝! – hassaanm 2010-07-14 06:42:21

+0

沒問題 - 不要忘記標記「接受」! – 2010-07-14 14:13:52