2011-07-29 10 views
2

私はcreateメソッドを持つRailsコントローラを持っており、RubyスクリプトからPOSTしたいと思っています。ブラウザベースのPOSTからこのメソッドを実行すると、paramsハッシュが適切に設定されますが、スクリプトからヒットするとハッシュは空になります。私はすでにprotect_from_forgeryを無効にしており、メソッドは呼び出されます。それはちょうど空のparamsを持っています。ここでRailsがRubyスクリプトからPOSTされたパラメータを認識しない

def create 
    logger.info "GOT: #{request.body.read}" 
    logger.info "PARAMS: #{params.inspect}" 
    az = AreaZip.new(params[:area_zip]) 
    if az.save 
    respond_to { |format| 
     format.js { render :json => {:id => az.id} } 
    } 
    else 
    logger.warn "FAILED creating AreaZip: #{az.errors.inspect}" 
    respond_to { |format| 
     format.js { render :json => {:errors => az.errors} } 
    } 
    end 
end 

投稿したコードされています:

POST /admin/area_zips HTTP/1.1 
Accept: */* 
Connection: close 
Content-Type: text/plain; charset=utf-8 
Authorization: Basic sdfnjjsadf[censored]jklsdfsjdfkj 
Content-Length: 54 
Host: localhost:12345 

area_zip%5Bzip%5D=15068-4838&area_zip%5Barea_id%5D=334 

私が投稿する場合:ここで

def self.post(url, path, params={}) 
    url = "#{url}#{path}" 
    uri = URI.parse(url) 
    headers = { 
    'Content-Type' => 'text/plain; charset=utf-8', 
    'Authorization' => "BasiC#{Base64.encode64('censored:censored').strip}", 
    } 

    http = Net::HTTP.new(uri.host, uri.port) 
    post_data = params.map {|k,v| "#{CGI::escape(k.to_s)}=#{CGI::escape(v.to_s)}" }.join("&") 
    resp, data = http.post(uri.path, post_data, headers) 
    return JSON.parse(data) 
end 

は、私がnc -l -p 12345に投稿する場合、私は何を参照してください。ここでコントローラメソッドがあります私のRailsアプリに、私のログはこれを示す:

Started POST "/admin/area_zips" for 127.0.0.1 at Fri Jul 29 09:45:05 -0400 2011 
    Processing by Admin::AreaZipsController#create as */* 
Asking for HTTP basic authentication to reach admin page 
GOT: area_zip%5Bzip%5D=15068-6851&area_zip%5Barea_id%5D=334 
PARAMS: {"action"=>"create", "controller"=>"admin/area_zips"} 
    SQL (0.2ms) BEGIN 
    SQL (0.2ms) ROLLBACK 
FAILED creating AreaZip: #<OrderedHash {:area=>["can't be blank"], :zip=>["can't be blank"]}> 
Completed 200 OK in 70ms (Views: 41.4ms | ActiveRecord: 1.2ms) 

あなたが見るように、RailsはPOSTされたデータを取得しますが、それを使用してparamsを設定していません。どんな考え?

+0

あなたのパラメータをエスケープしてみましたか?私はポストデータではなくプレーンなURL以外のものをエスケープする必要はないと思います。また、POSTを行うための推奨される方法については、 'Net :: HTTP'ドキュメントをチェックしてください:http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/classes/Net/HTTP.html – Casper

+0

Paramsは実際に想定されていますPOSTでエスケープすると、データを送信するときにブラウザがエスケープしていることがわかります。とにかくエスケープしてみましたが、それは修正されませんでした。 –

+0

ドキュメントを参照していただきありがとうございます。私は前にbasic_authメソッドに気付かなかった。つまり、自分のヘッダーを送信する必要はありません。これは、私の他のアプローチではなく、set_form_dataメソッドを使用できることを意味します。 –

答えて

5

さて、私はこれを解決しました。 Content-Typeヘッダーが問題だったことが分かります。私はapplication/x-www-form-urlencodedに設定する必要があります。実際に私はこれをやっていると思ったが、明らかにそうではなかった。その古いContent-Type値はコピーペーストエラーで、私のgetメソッドのコードから残っています。

+0

今すぐ良い市民になり、あなた自身の答えを受け入れる:) –

関連する問題