2

私は一般的にWeb開発にかなり慣れておらず、(最終的には)Androidアプリと対話したいRubyonRailsアプリに取り組んでいます。私は現在、Androidアプリから送信されるhttpPOSTからオブジェクトを作成するための最も適切で安全な方法を探しています。

Chrome用のRESTクライアント拡張機能を使用してローカルホスト上のアプリにPOSTを送信し、POST情報からオブジェクトを作成することで、これを最初に実現するためのアプローチ方法です。

これは、Chrome拡張機能からのPOSTの結果です。

Started POST "/problems" for 127.0.0.1 at 2012-09-15 14:16:19 -0400
Processing by ProblemsController#create as */*
  Parameters: {"user"=>"7876483097", "latitude"=>"18.378383", "longitude"=>"-67.026201", "ptype"=>"2", "description"=>"Poste roto"}
  ←\[1m←\[36m (0.0ms)←\[0m  ←\[1mbegin transaction←\[0m
  ←\[1m←\[35m (0.0ms)←\[0m  rollback transaction
  Rendered problems/new.html.erb within layouts/application (31.0ms)
  Rendered layouts/_shim.html.erb (0.0ms)
  ←\[1m←\[36mUser Load (0.0ms)←\[0m  ←\[1mSELECT "users".* FROM "users" WHERE "users"."remember_token" = 'gdmKIurcqDOMoDGWE4IBng' LIMIT 1←\[0m
  Rendered layouts/_header.html.erb (4.0ms)
  Rendered layouts/_footer.html.erb (1.0ms)
Completed 200 OK in 93ms (Views: 87.0ms | ActiveRecord: 0.0ms)

「ロールバックトランザクション」が表示される場所は、createメソッドの@problem.saveが失敗したことを意味します。誰かが私が欠けているものを特定するのを手伝ってくれるか、それを正しく行うために私のアプローチをどのように変えるべきかを教えてもらえますか?

これが私のモデルスキーマです:

  create_table "problems", :force => true do |t|
    t.string   "user"
    t.float    "latitude"
    t.float    "longitude"
    t.integer  "ptype"
    t.string   "description"
    t.integer  "priority"
    t.integer  "status"
    t.datetime "created_at",          :null => false
    t.datetime "updated_at",          :null => false
    t.string   "avatar_file_name"
    t.string   "avatar_content_type"
    t.integer  "avatar_file_size"
    t.datetime "avatar_updated_at"
    t.boolean  "gmaps"
    t.string   "address"
  end

これが私のcreateメソッドです:

  def create
    @problem = Problem.new(params[:problem])
    if @problem.save
      flash[:success] = "Problema guardado"
      redirect_to @problem
    else
      @problem.errors.full_messages
      flash.now[:error] = 'Informacion incorrecta'
      render 'new'
    end
  end

これはPOST本文です。

user=7876483097&latitude=18.378383&longitude=-67.026201&ptype=2&description=Poste+roto

そして、これは問題モデルと検証です

class Problem < ActiveRecord::Base

    acts_as_gmappable :latitude => 'latitude', :longitude => 'longitude', :process_geocoding => :geocode?,
                  :address => "address", :normalized_address => "address",
                  :msg => "Lo sentimos, ni Google puede localizar esa direccion"

    attr_accessible :user, :latitude, :longitude, :ptype, :description, :avatar, :address
    validates(:user, presence: true)
    validates(:latitude, presence: true)
    validates(:longitude, presence: true)
    validates(:ptype, presence: true)

前もって感謝します。

4

2 に答える 2

2

問題は、POST本文として送信するフィールドの名前にあります。

の新しいインスタンスはProblemを使用して構築されていることに注意してくださいparams[:problem]

したがって、フィールドには、単なるまたはではなくproblem[user]、、などの名前が付けられることになっています。problem[latitute]userlatitude

于 2012-09-15T20:37:54.040 に答える
0

post構文は次のようになります。

Parameters: {"problem"=>{"user"=>"7876483097", "latitude"=>"18.378383", "longitude"=>"-67.026201", "ptype"=>"2", "description"=>"Poste roto"}}

あなたが持っているものの代わりに:

Parameters: {"user"=>"7876483097", "latitude"=>"18.378383", "longitude"=>"-67.026201", "ptype"=>"2", "description"=>"Poste roto"}

問題はおそらく、残りのクライアント拡張機能を使用して投稿を作成している方法にあります。コマンドラインまたはターミナルからcurlを使用する方が簡単だと思います。

ターミナルまたはコマンドラインで次のようなものを使用してみてください。

curl -H "Content-Type:application/json" -H "Accept:application/json" -d "{\"problem\":{\"user\":\"7876483097\", \latitude\":\"18.378383\", \"longitude\":\"-67.026201\",\"ptype\":\"2\",\"description\":\"posteroto\"}}" http://localhost:3000/problems
于 2012-09-15T21:12:54.410 に答える