3

これは長い質問ですので、把握に時間がかかる場合はお詫び申し上げます。できるだけシンプルにしておきます。

私はここで少し必死になり始めていますが、私はとても近くにいます。私はしばらくの間Rubyと格闘していて、postとnet::httpと通信しています。だから私が今持っているのはハッシュがjsonに変換されていることです。net :: httpからのPOSTリクエストを使用してネットワーク経由で送信され、それをオブジェクトに戻そうとしています。

私が調査したルートの1つは、アクティブレコードとアクティブリソースでしたが、双方でいくつかの問題が発生した後、独自のモデルを定義し、変換方法を検討して送信することにしました。

私のモデル

このモデルはcustomRequestと呼ばれます。その中に、2つのクラス変数をハッシュに取り込んでjsonに変換し、それを送信するpost_meがあります。

class CustomRequest
  require 'json'
  require 'net/http'
  attr_accessor :myString, :myInteger

  def initialize(myString,myInteger)
    @myString = myString
    @myInteger = myInteger
  end

  def post_me

    @myReq = {:myString => @myString, :myInteger =>@myInteger}
    myJsonReq = @myReq.to_json
    #myJsonReq = JSON.generate(@myReq)
    puts myJsonReq
    #    res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3008/user_requests/add'),
    #    myJsonReq)

    res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3008/user_requests/add.json'),
    myJsonReq).as_json
  end
end

これがカスタムリクエストです。

質問

私が心配しているビットは次のとおりです。

  1. 受信URLは、コントローラールートで形式が決定されるため、add.jsonと記述しました。それが必要かどうかわかりませんか?
  2. 変数からハッシュを生成して再構築のために送信する方が良いですか、それともクラス全体を_jsonに変換して送信する方が良いですか?

Railsコンソールでクラスをそのまま作成して送信すると、ターミナルで200と応答が返されます。

詳細

(注:シーンで何が起こっているのかを本当に知りたい場合にのみ、このビットを読んでください)

@test.post_me
{"myInteger":300,"myString":"testestest"}
=> {"x-ua-compatible"=>["IE=Edge"], "etag"=>["\"d41d8cd98f00b204e9800998ecf8427e\""], "connection"=>["Keep-Alive"], "content-type"=>["application/json; charset=utf-8"], "date"=>["Thu, 14 Jul 2011 15:54:24 GMT"], "server"=>["WEBrick/1.3.1 (Ruby/1.8.7/2009-06-12)"], "x-runtime"=>["0.022517"], "content-length"=>["0"], "set-cookie"=>["_webApp_session=BAh7BiIPc2Vzc2lvbl9pZCIlZTJmM2IwYmVhZWMwM2E2ZGQzNWEwMDUwNmE2NDhlM2U%3D--5312eec4795d9f0633520c01992422e9c15746e4; path=/; HttpOnly"], "cache-control"=>["max-age=0, private, must-revalidate"]}
>> 

これが同じ応答です。Jsonに変換しない場合:

{"myInteger":300,"myString":"testestest"}
=> #<Net::HTTPOK 200 OK  readbody=true>

誰かが質問1と2に答えてくれたら、私は素晴らしいと思います


サーバ側

リクエストを受け取り、それをJsonとオブジェクトに戻す必要があるサーバー側を次に示します。私は、ほとんどがコメントアウトされているさまざまなことを試しました。

基本的に、タグに詳細が記載された200の応答が返されますが、ハッシュオブジェクトを配置しようとすると、何も返されません/

Started POST "/user_requests/add" for 127.0.0.1 at Thu Jul 14 16:56:07 +0100 2011
  Processing by UserRequestsController#add_request as 
  Parameters: {"{\"myInteger\":300,\"myString\":\"testestest\"}"=>""}
Rendered user_requests/add_request.json.erb (0.3ms)
Completed 200 OK in 31ms (Views: 27.4ms | ActiveRecord: 0.0ms)

これは、それを分解してオブジェクトに戻すという複数の試みです。

  def add_request
    require 'rubygems'
    require 'json'

    #@custom = CustomRequest.new(params[:custom]) 
    #@custom = CustomRequest.new(JSON.parse(params[:custom]))
    #@custom = CustomRequest.new(params[:custom]).from_json
    #@custom = CustomRequest.new(params[:custom].from_json) 


     @myHash = Hash.new(params[:myHash])
     #@myHash = Hash.new(JSON.parse(params[:myHash]))
    #@myHash = Hash.new(params[:myHash]).from_json
    #@myHash = Hash.new(params[:myHash].from_json) 


     puts "IT WORKS!"
     puts @myHash.to_s

1つは送信されたハッシュからオブジェクトを再作成しようとしたことと、もう1つはhash_to_jsonをhash_from_jsonに再作成しようとしたことを除いて、すべてほとんど同じです。

さらに質問を

それで:

  1. params(:myHash)を使用してオブジェクトを正しく作成していますか、それとも各変数を個別に参照する必要がありますか?
  2. paramsは自動的に読み取り可能な形式に戻されますか、それともJSONに入れたり、JSONを解析したりする必要がありますか?それに関して、私がどちらを使うかは重要ですか?
  3. オブジェクトを正しく再構築していますが、何も表示されないのはなぜですか?
  4. (オプション)その後、テーブルに保存する簡単な方法はありますか?
4

1 に答える 1

2

簡単な答えは、すべてを分解することです。クラスをハッシュに変えてから、Jsonに送ってください。Jsonから元に戻し、オブジェクトを再作成します。

サーバー側のコントローラー::

class UserRequestsController < ApplicationController
  # POST /user_requests
  # POST /user_requests.xml
  def add_request
    require 'rubygems'
    require 'json'
    #@user_request = UserRequest.new(params[:user_request])
    #@user_request = UserRequest.new(JSON.parse(params[:user_request]))
    #@user_request = UserRequest.new(params[:user_request].from_json)

    #puts @user_request

    #@custom = CustomRequest.new(params[:custom])
    #@custom = CustomRequest.new(JSON.parse(params[:custom]))
    #@custom = CustomRequest.new(params[:custom]).from_json
    #@custom = CustomRequest.new(params[:custom].from_json)

    @myHash = Hash.new()
    @myHash = params
    #puts (params[:url])

    #puts YAML::dump(params)
    # puts YAML::dump(params[:url])
    #@myHash = Hash.new(JSON.parse(params[:myHash]))
    #@myHash = Hash.new(params[:myHash]).from_json
    #@myHash = Hash.new(params[:myHash].from_json)

    puts "IT WORKS!"

    #puts @myHash
    #puts YAML::dump(@myHash)
    #@myHash.each { |k,v| puts "#{k} => #{v}" }\

    #@user_request = CustomRequest.new(@myHash[:url],@myHash[:depth])
    #@user_request = CustomRequest.new(@myHash[:url],@myHash[:depth])
    #@user_request = CustomRequest.new(Time.now,Time.now,params[:depth],params[:depth],nil)

    # Had to manually create the record because it couldnt take it from a single param
    @user_request = CustomRequest.create(:created_at =>Time.now,
    :updated_at => Time.now,
    :depth => @myHash[:depth],#myHash is the params broken into a hash
    :url => @myHash[:url],
    :status => "Yet to be crawled")

    puts  "YAML DUMP CUSTOM OBJECT"
    puts  YAML::dump(@user_request)

    respond_to do |format|
      if @user_request.save
        format.json { render :json => @myHash, :status => :created}
      else if @myHash.nil?
          format.json  { render :json => @user_request.errors, :status => :unprocessable_entity }
        #ß  format.xml  { render :xml => @user_request, :status => :created}#, :location => @user_request }
        else
          format.json  { render :json => @user_request.errors, :status => :unprocessable_entity }
        #ß  format.xml  { render :xml => @user_request, :status => :created}#, :location => @user_request }
        end
      end
    end

クライアント側のモデル投稿メソッド:

  def post_me

        res = Net::HTTP.post_form(URI.parse('http://127.0.0.1:3008/user_requests/add.json'),
                                  {'url' =>'UserRequest::url'}).as_json
于 2011-07-22T10:37:37.587 に答える