2010-11-19 6 views
3

私はここに概念証明の仕事をしていますが、私が思っていたよりも少し問題があります。ここに私がしたいことと、私が現在どのようにしているかがあります。jsonを解析し、S​​inatraとDataMapperを使用してそのデータをデータベースに書き込む方法

下記のシンプルなメッセージを含むjsonファイルをSinatraアプリに送信します。

[ 
     { 
     title: "A greeting!", 
     message: "Hello from the Chairman of the Board" 
     } 
] 

私はのparamsを取ると私はタイムスタンプとIDがしかし、データベースに保存されているメッセージを送信するとSQLiteのデータベース

post '/note' do 

    data = JSON.parse(params) #<---EDIT - added, now gives error. 

    @note = Note.new :title => params[:title], 
          :message => params[:message], 
          :timestamp => (params[:timestamp] || Time.now) 
    @note.save 
end 

に書き込むために使用していますポストを持ってそこからタイトルとメッセージはゼロです。

私には何が欠けていますか?

おかげ

編集:私は私のアプリを実行し、それをJSONファイルを送信するとき

は今、私はこのエラーを取得する:

C:/ユーザー/ノーム/ルビー/ Ruby192/libに/ルビー/1.9.1/webrick/server.rb:183:in 'start_threadのブロック' TypeError:ハッシュを文字列に変換できません

編集2:いくつかの成功:

私はjsonが投稿される方法であるファイル呼び出しtest.jsonに上記のjsonを持っています。ファイルを投稿するためには、私はHTTPClientを使用:いくつかのより多くのそれについて考えた後

require 'httpclient' 

HTTPClient.post 'http://localhost:4567/note', [ :file => File.new('.\test.json') ] 

を、私は、ファイルはそう、私はそれを別の方法を送信しようとした問題だった投稿と思いました。だから私は近づいています

data = JSON.parse(request.body.read) 

私の新しいsend.rb

require 'net/http' 

require 'rubygems' 
require 'json' 

@host = 'localhost' 
@port = '4567' 

@post_ws = "/note" 

@payload ={ 
    "title" => "A greeting from...", 
    "message" => "... Sinatra!" 
    }.to_json 

def post 
    req = Net::HTTP::Post.new(@post_ws, initheader = {'Content-Type' =>'application/json'}) 
      #req.basic_auth @user, @pass 
      req.body = @payload 
      response = Net::HTTP.new(@host, @port).start {|http| http.request(req) } 
      puts "Response #{response.code} #{response.message}: 
      #{response.body}" 
     end 

thepost = post 
puts thepost 

:以下の例では、私がこれまでのn私のポスト/ノートハンドルを変更し、一度働きました。これまでのすべての助けに感謝します。

答えて

6

シナトラはあなたのために自動的にJSONを解析し、幸いにもJSONを解析することは非常に簡単ですしません。いつものようにそれを必要と

スタート。 require 'rubygems'あなたはルビー1.9+でいないのであれば:

いくつかのJSONを解析した後、作成するための往復利用だ
>> require 'json' #=> true 
>> a_hash = {'a' => 1, 'b' => [0, 1]} #=> {"a"=>1, "b"=>[0, 1]} 
>> a_hash.to_json #=> "{"a":1,"b":[0,1]}" 
>> JSON.parse(a_hash.to_json) #=> {"a"=>1, "b"=>[0, 1]} 

。 IRBの出力には、ハッシュと埋め込み配列がJSONに変換され、次に解析されてハッシュに戻されたことが示されます。あなたはあなたの悪いニーズのためにそれを打ち破ることができるはずです。

フィールドを取得するには、上記の例をもう少し解説し、接続のリモート側からJSONを受信したと見せます。したがって、以下のreceived_jsonは入力データストリームです。それをJSONパーサに渡すと、Rubyデータハッシュが返されます。

>> received_json = a_hash.to_json #=> "{"a":1,"b":[0,1]}" 
>> received_hash = JSON.parse(received_json) #=> {"a"=>1, "b"=>[0, 1]} 
>> received_hash['a'] #=> 1 
>> received_hash['b'] #=> [0, 1] 

の着信JSONはおそらくあなたのparams[]ハッシュ内のパラメータであるが、私はあなたがする必要がありますので、それは、下に隠れてしまう何キーわからない:あなたが値を取得し、通常どおりにハッシュにアクセスそれを理解する。それは'json'または'data'と呼ばれるかもしれませんが、それはアプリ固有です。

あなたのデータベースコードは大丈夫です。書き込まれたデータの一部が表示されている場合は、動作している必要があります。 JSONからフィールドを取得する必要があるようです。

+0

ハッシュとjsonのあなたの説明のためにグレッグ感謝します。非常に役立ちます。 – Norm

+0

'params'がうまく動作するJSONデータストリームである場合。 –

+0

Arrgggg。 – Norm

関連する問題