What is the most appropriate way to create an object in Ruby on Rails app through an http POST?
我通常对Web开发还很陌生,我一直在开发Ruby on Rails应用程序,我希望(最终)与Android应用程序进行交互。我目前正在寻找一种最合适,最安全的方法,该方法可以通过将要从Android应用程序发送的http POST创建对象。
通过使用chrome的REST客户端扩展尝试将POST发送到本地主机上的我的应用程序,并让它根据POST信息创建对象的方式,我初步达到了这一目标。
这是chrome扩展程序中POST的结果:
1 2 3 4 5 6 7 8 9 10 11 | 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失败。任何人都可以帮助您确定我所缺少的内容,或者我应该如何改变自己的方法来正确地做到这一点。
这是我的模型架构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 |
这是我的创建方法:
1 2 3 4 5 6 7 8 9 10 11 | 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正文:
1 | user=7876483097&latitude=18.378383&longitude=-67.026201&ptype=2&description=Poste+roto |
而且,这是问题模型和验证
1 2 3 4 5 6 7 8 9 10 11 | 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) |
预先感谢。
问题在于您作为POST正文发送的字段的命名。
请注意,
因此应该将这些字段命名为
这是post构造的样子:
1 | Parameters: {"problem"=>{"user"=>"7876483097","latitude"=>"18.378383","longitude"=>"-67.026201","ptype"=>"2","description"=>"Poste roto"}} |
而不是您拥有的内容:
1 | Parameters: {"user"=>"7876483097","latitude"=>"18.378383","longitude"=>"-67.026201","ptype"=>"2","description"=>"Poste roto"} |
问题可能仅在于您使用其余客户端扩展构建帖子的方式。我发现仅通过命令行或终端使用curl会更容易。
请尝试在终端或命令行中使用以下类似内容:
1 | 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 |