0

私はいくつかのjsonを吐き出す単純なクラッドインターフェースを作成しようとしています。(api)

私はそれを作るために刺激的なスプリーコードベースを使用しています、今ではそれを安全にするためのトークンはありません

以下のコードを参照してください。

helper / api / api_helper.rb

module Api
  module ApiHelper
    def required_fields_for(model)
      required_fields = model._validators.select do |field, validations|
        validations.any? { |v| v.is_a?(ActiveModel::Validations::PresenceValidator) }
      end.map(&:first)
    end

    def product_attributes
      [:id, :name]
    end
  end
end

views / api / products / new.rabl

object false
node(:attributes) { [*product_attributes] }
node(:required_attributes) { required_fields_for(Product) }

controllers / api / products_controller.rb

def new
end

def create
  @product = Product.new(params[:product])
  if @product.save
    respond_with(@product, :status => 201, :default_template => :show)
  else
    invalid_resource!(@product)
  end
end

curlを介してPOSTリクエストを実行すると、製品名が空であってはならないという事実(モデル検証)が原因で、メソッドは422UnprocessableEntityエラーを返します。ご覧のとおり、名前が正しく設定されています!!

これ(シリアル化)の何が問題になっているのかわかりませんでしたか?

curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d ' {"attributes":{"name":"test"}}'  http://localhost/api/brands

* About to connect() to localhost port 80 (#0)
*   Trying 127.0.0.1... connected
* Connected to localhost (127.0.0.1) port 80 (#0)
> POST /api/products HTTP/1.1
> User-Agent: curl/7.19.7 (universal-apple-darwin10.0) libcurl/7.19.7 OpenSSL/0.9.8r zlib/1.2.3
> Host: localhost
> Accept: application/json
> Content-type: application/json
> Content-Length: 31
> 
< HTTP/1.1 422 Unprocessable Entity
< Content-Type: application/json; charset=utf-8
< X-Meta-Request-Version: 0.2.0
< X-UA-Compatible: IE=Edge
< Cache-Control: no-cache
< X-Request-Id: e32527947ed4ae51052b4d65d9d4539f
< X-Runtime: 0.042655
< Connection: close
< 
* Closing connection #0
{"errors":{"name":["doit \u00eatre rempli(e)"]}}
4

1 に答える 1

0

JSONペイロードは、モデルの名前の下にネストされていることが期待されます。これを試して:

-d ' {"product":{"name":"test"}}'
于 2013-01-15T09:40:41.197 に答える