2014-10-16 45 views
0

我有一個控制器:respond_to代碼:json的行爲非常奇怪

class ThingController < ActionController 
    respond_to :json 

    def create 
    puts "CREATE " + params.inspect 
    end 
end 

和測試:

require "spec_helper" 

describe "/thing" do 
    context "create" do 
    it "should get params" do 
     params = {"a" => "b", "c" => ["d"], "e" => [], "f"=>"", 
       "g"=>nil, , "controller" => "NOPE", "action" => "NOPE"} 
     post uri, params 
    end 
    end 
end 

當我運行此,以下記錄:

CREATE {"a"=>"b", "c"=>["d"], "action"=>"create", "controller"=>"thing"} 

我問題是:

  • e去哪了?我期望它能夠反序列化爲一個空數組,而不是一無所有。
  • 爲什麼actioncontroller params被混入呢?身體和鐵軌內部不是完全分開的擔憂?
  • 因此,我的actioncontroller JSON字段被覆蓋。我將如何訪問這些?
  • 這是不是接受JSON的正確方法?

我是新來的Rails,但我做了很多Django。

回答

0

這個問題有兩個部分:您需要確保您的參數以JSON形式發送,並且它們被解釋爲JSON。

從本質上講,你要

  • 編碼參數,作爲JSON
  • 設置適當的內容類型,並接受頭

POSTing raw JSON data with Rails 3.2.11 and RSpec了道路。

+0

太好了,謝謝。我正在追蹤一個必須被輕微破壞的例子。 – Joe 2014-10-17 10:09:05

0

rails中間件將添加操作和控制器參數,因此如果您仍想訪問自定義值,則必須將這些參數放入嵌套哈希中。

嘗試將format: 'json'添加到測試中的參數中。這將發送一個不同的內容類型標題,並可能有助於正確序列化參數,以保持e參數。