的docs on parameter wrapping狀態:爲什麼Rails參數包裝中不包含從URI中循環播放的東西?
裹參數散列到嵌套散列。這將允許客戶端提交POST請求,而不必指定任何根元素。
它有用地消除其中參數散列被包裹。該Action Controller overview guide給這個破敗:
的Rails收集所有與在
params
哈希的請求一起發送的參數,無論是作爲查詢字符串或後身體的一部分被髮送。 [...]query_parameters
散列包含作爲查詢字符串的一部分發送的參數,而request_parameters
散列包含作爲帖子正文的一部分發送的參數。path_parameters
散列包含的參數被路由識別爲通向此特定控制器和操作的路徑的一部分。
當您使用RESTful資源和路由時,樂趣就會發生。假設你有一個模型A has_many Bs; B因此具有外鍵a_id
。
你POST /as/1/bs
與一個空的有效載荷(因爲B沒有其他領域)。假設a_id
是attr_accessible
,則可以假定a_id
將被包裝在b
對象中。相反,你會看到:
Processing by BsController#create as HTML
Parameters: {"b"=>{}, "a_id" => "1"}
沒有這樣的運氣。事實證明,ParamsWrapper
uses request_parameters
而不是params
,所以在POST有效負載中不包括a_id
意味着它不會被包裝。這非常令人困惑,因爲您仍然看到它包含在params
中,這是由於URI通配,並且奇怪爲什麼它排除了所有內容。
有沒有什麼好的理由在這裏使用request_parameters
而不是params
?
我可以理解,從「REST哲學」的角度來看,如果我們假設有效載荷包含整個對象,那麼它更純粹,但這基本上意味着URI中的a_id
被完全忽略,這似乎是可憐。
tl; dr:ParamsWrapper
使用request_parameters
作爲參數源,因此會跳過URI- globbed變量。這是一個Rails錯誤?純粹的REST倡導者可能會說不,但實用主義表明是的。
你好!你有沒有想過如何解決這個問題? – dan
@dan:不幸的是,自從我發佈這個問題幾個月後,我還沒有與Rails合作過,所以我一無所有! – Ashe