2015-06-07 11 views
0

我想從參數中訪問三個鍵。在rails中的strong_parameters爲多個鍵

說我params爲:

params = { 
    'product_id' => 11, 
    'category' => { 
        'name' => 'Pet', 
        'sub_categories' => {5 => 'Name1', 7 => 'Name2'} ## **UPDATE** 
        'id' => 100 
    }, 
    'user_action' => 'save' 
} 

現在我想用強大的參數來篩選這些關鍵的。即

#Inside controller 
#action 
def save_product_category 
    product_params[:product_id] 
    product_params[:category] 
    product_params[:user_action] 
end 

private 
    def product_params 
    params.permit(:product_id, :user_action, :category) # Doesn't work, eliminates 'category' key 
    end 

如何過濾出這三個鍵?

UPDATE: 我發現這樣做的一種方式:

params.slice(:product_id, :category, :user_action) 

它是做正確的方式?

更新2: 下面是正確答案:

params.permit(:product_id, :user_action, :category => [:id, :name, :sub_categories => {}]) 

感謝@R_O_R和@twonegatives幫助我和軸承與我:)

回答

1

那麼你想

def product_params 
    params.permit(:product_id, :user_action, category: [ :name, :id ]) 
end 

Nested Parameters

+0

你能幫忙更新查詢嗎?謝謝。 – Indyarocks

+0

不,他們不一樣。在使用'slice'時,您正在從'params'中提取所需的屬性,這是另一個'Hash'對象,用於更新。但是如果你想直接使用'param'對象,你需要藉助** strong參數**。 –

+0

同意。但在更新後的查詢中,我更新了'category'中所需的參數。你能否檢查一下上面問題的'params'部分的'category'的'sub_categories'? – Indyarocks

1

你應該明確地定義參數的所有嵌套的屬性:

def product_params 
    params.permit(:product_id, :user_action, category: [:id, :name]) 
end 

參考Rails 4 Strong parameters nested objects

UPDATE

至於你的問題的有關slice,好,那使用是可能的以及。長話短說,早在2012年,人們就使用Rails 3,它沒有提供任何方法來過濾控制器中的傳入參數,因此使用slice方法。有些時候可以在這裏找到stackoverflow(見slicing on mass assignment)和github(這裏是來自DHH的創建者,Ruby on Rails的gist)。在一天結束時,strong parameters寶石僅僅是提取slice模式。但現在它會更方便地跟蹤permit模式的Rails 4.

+0

你能幫忙更新查詢嗎?謝謝。 – Indyarocks

+0

我已經用'slice'方法的註釋更新了我的答案。 – twonegatives

+0

我更新了'category'中所需的參數。你能否檢查以上問題的params部分的分類的子分類?請參考以前的回答的評論。 – Indyarocks

相關問題