2015-09-09 27 views
3

我的控制器方法對我的ERB表單非常適用,但不接受數組作爲JSON參數。我有一個叫做「style_ids」的ID數組,從JSON中被剝離出來。如何在Rails中POST/PUT數組參數

允許的參數:

params.require(:beer).permit(:name, :brewery_id, :style_ids => []) 

當從ERB貼,它看起來像這樣:

all params: {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>」…」, "beer"=>{"name"=>"Amber", "style_ids"=>["", "1"], "brewery_id"=>"16"}, "commit"=>"Submit", "action"=>"update", "controller"=>"beers", "id"=>"213"} 
permitted params: {"name"=>"Amber", "brewery_id"=>"16", "style_ids"=>["", "1"]} 

當我通過JSON提交不過,它看起來像這樣:

params: {"id"=>"213", "name"=>"Amber", "style_ids"=>["1", "22"], "brewery_id"=>16, "action"=>"update", "controller"=>"beers", "beer"=>{"id"=>213, "name"=>"Amber", "brewery_id"=>16}} 
Unpermitted parameters: id 
permitted params: {"name"=>"Amber", "brewery_id"=>16} 

我猜這與Rails在我的常規請求中顯示啤酒哈希中的style_ids有關。我在做什麼錯誤,這是不會顯示在我的JSON請求? JSON真的很簡單:{"id":213,"name":"Amber","style_ids":["1","22"],"brewery_id":16}

我已經閱讀了很多有關這方面的文檔,覺得我正在以正確的方式做...希望我只是錯過了一些東西。謝謝!

+0

喜丹尼斯,哪裏是你的控制器允許參數動作我加入這個我控制器頂部固定呢? –

+1

其實這應該是'啤酒'裏面。看看你在控制器上寫的是'params.require(:beer)',這意味着參數哈希有一個名爲'beer'的鍵,並且允許的屬性在裏面。在你的'JSON'請求中你有這樣的:''beer'=> {「id」=> 213,「name」=>「Amber」,「brewery_id」=> 16}''''它顯示'不允許的參數:id'。其餘的它不關心你發送的任何東西。因爲rails會使用'beer'內的屬性來創建/更新它。 – Deep

+0

那麼,爲什麼在使用JSON時,style_ids不在啤酒哈希內? Rails認爲該散列內的其他參數,而不是style_ids。 @huanson,我不知道我跟着...整個許可參數是在一個函數內: '''def beer_params params.require(:beer).permit(:name,:brewery_id,:style_ids = > []) end''' 我從我的更新中調用此函數並創建函數。 – Dennis

回答

2

我終於明白了這一點。 Rails使用的是wrap_parameters,所以我可以使用{「name": 「name」}而不是{「beer:{「name」 : 「name」}}。默認情況下,Rails將從您的模型的attribute_names包裝任何東西。

我的問題是style_ids是一個外部連接表(has_and_belongs_to_many),所以這不在attribute_nameswrap_parameters :beer, include: [:style_ids, :name, :brewery_id]

終於讓我通過這個鏈接:http://api.rubyonrails.org/classes/ActionController/ParamsWrapper.html