2013-08-27 44 views
6

因此,似乎沒有任何干淨的方式來一般性地允許具有強參數的哈希字段。這當然可能是一個強烈的參數問題,但我很好奇,如果有解決方法。我有一些領域的典範......使用強參數的Mongoid中的動態哈希字段

field :name, type: String 
field :email, type: String 
field :other_stuff, type: Hash, default: {} 

現在我可以只允許一切:

params.require(:registration).permit! 

但是,這是不是一個真正的偉大的想法,就是我想要做的東西像...

params.require(:註冊).permit(:名稱,:電子郵件,{other_stuff:{}})

然而,這似乎並不可能具有較強的參數,它不是沒有可能只是白色將哈希作爲屬性(對於以SQL爲中心的ActiveRecord API!)。任何想法如何做到這一點,或者我最好提交一個Rails補丁來支持這種情況。

回答

8

好吧,研究這個之後,我找到了一個完美的解決方案,我將開始使用過多:

params.require(:registration).permit(:name).tap do |whitelisted| 
    whitelisted[:other_stuff] = params[:registration][:other_stuff] 
end 

來源:https://github.com/rails/rails/issues/9454#issuecomment-14167664

+0

Eeeeewwww。但你是對的,這似乎是這樣打算處理的方式。 –

0

如果需要嵌套的屬性,也可以允許如下:

def create_params 
    params[:book]["chapter"].permit(:content) 
end 
0

對於允許嵌套散列的字段,我使用以下解決方案:

def permit_recursive_params(params) 
    params.map do |key, value| 
    if value.is_a?(Array) 
     { key => [ permit_recursive_params(value.first) ] } 
    elsif value.is_a?(Hash) || value.is_a?(ActionController::Parameters) 
     { key => permit_recursive_params(value) } 
    else 
     key 
    end 
    end 
end 

將它應用到例如values參數,可以使用它像這樣:

def item_params 
    params.require(:item).permit(values: permit_recursive_params(params[:item][:values])) 
end