2016-09-16 48 views
0

我生成一個新的導軌5 --api --database = PostgreSQL的應用程序中的一天,僅創建一個支架(英雄)。我想知道強參數鐵軌是如何工作的,因爲我看到一些奇怪的行爲:導軌5 API斯特朗參數行爲

控制器的樣子:

def create 
    hero = Hero.new(hero_params) 

    if hero.save 
    render json: hero, status: :created, location: hero 
    else 
    render json: hero.errors, status: :unprocessable_entity 
    end 
end 

我hero_params是這樣的:

def hero_params 
    params.require(:hero).permit(:name) 
end 

,所以我會假設客戶端需要提交包含"hero"鍵的哈希和它允許有被允許時,該控制器動作稱爲被大量分配"name「子項。

意思,JSON應該是這樣的:

{ 
    "hero": { 
    "name": "test" 
    } 
} 

一切都很好,但這裏是我看到奇怪的行爲。當用戶提交的確切JSON如上,參數進來爲:

Parameters: {"hero"=>{"name"=>"test"}} 

現在,如果用戶提交了剛:

{ "name": "test" } 

它仍然創建了一個新的資源和參數進來如下:

Parameters: {"name"=>"test", "hero"=>{"name"=>"test"}} 
  1. 爲什麼有兩組參數,一個符合實際提交的數據,一個在的格式英雄對象,好像它正在預期大規模的任務?

  2. 怎麼來的require(:hero)不會引發錯誤時,該鍵不提交?我認爲這個問題的答案是因爲什麼是自動從問題1

上什麼,我在這裏失蹤的任何信息,將不勝感激創建第二哈希("hero"=>{"name"=>"test"}},因爲這是準系統軌行爲OUT- 。的現成

+0

看起來用戶提交了BOTH參數格式,例如, '{name:「test」,hero:{name:「test」}}'。這可能嗎? – messanjah

+0

不,我是用戶,我通過POSTMAN發送了我的請求,這兩個示例都是分開發送的。 –

回答

1

這種現象來源於ActionController::ParamsWrapper

裹參數散列到嵌套的散列這將允許客戶端無需指定任何根元素提交請求

。個

Rails應用程序都默認激活JSON請求參數包裝。您可以通過編輯config/initializers/wrap_parameters.rb來全局禁用它,或者通過在控制器中包含wrap_parameters false來控制單個控制器。