0

RubyonRailsローカルサーバーにPOSTリクエストを送信しようとしています。残念ながら、最初はprotect_from_forgeryが原因でPOSTが許可されなかったため、開発と本番環境でfalseに設定することになりました。基本的に、私の問題は、必要なすべてのパラメーターを使用してCocoaアプリからPOSTリクエストを送信し、Rubyサーバーがそれを認識できるようにすることです。ただし、サーバーがリクエストを挿入するたびに、created_atとupdated_atを除いて、すべてのVALUESがNULLに設定されます。Ruby on Railsがどのように機能するか(scaffoldを使用したため)わからないため、正しく挿入されるようにパラメーターをどこに設定する必要があるかわかりません。

ありがとう!

ココアコード:

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]

クライアントコントローラーでこれを実行しようとしましたが、問題は同じままでした:

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

必要な場合に備えて(フルクライアントコントローラー-すべてが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

PS私の質問について不明な点がある場合は、お知らせください。

4

1 に答える 1

1

コントローラにタイプミスがあります:@client = Client.new(:name => params[:names])する必要があります@client = Client.new(:name => params[:name])

これで問題の一部は解決しますが、その原因は次のとおりです。

基本的に、これが「実際の」Railsアプリである場合、次のようなパラメーターを送信します。

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

そして、次のようにparams [:client]の名前とIPにアクセスできます。

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

しかし、あなたは送っています:

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

だからあなたは必要です:

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

「Railsway」を機能させるには、Objective-Cコードを変更して、のようなパラメータを送信することができますclient[name]=x&client[ip]=y

于 2010-07-14T03:20:03.197 に答える