通过Http POST在Ruby on Rails应用程序中创建对象的最合适方法是什么?

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正文发送的字段的命名。

请注意,Problem的新实例是使用params[:problem]构建的。

因此应该将这些字段命名为problem[user]problem[latitute]等,而不只是userlatitude


这是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