2013-08-27 4 views
6

Quindi non sembra esserci alcun modo pulito per consentire genericamente il campo hash con parametri forti. Questo può naturalmente essere un forte problema di parametri, ma sono curioso di sapere se c'è una soluzione alternativa. Ho un modello con alcuni campi ...Campo hash dinamico in Mongoide utilizzando i parametri forti

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

Ora ho potuto solo permettere tutto:

params.require(:registration).permit! 

ma che non è in realtà una grande idea e quello che mi piacerebbe fare è qualcosa come ...

params.require (: registrazione) .permit (: nome,: e-mail, {other_stuff: {}})

Tuttavia, questo non sembra essere possibile con i parametri di forza, esso isn 'possibile solo whitelis t un hash come proprietà (yay per le API ActiveRecord centrate su SQL!). Qualche idea su come ciò potrebbe essere fatto, o è la mia migliore scommessa per presentare una patch di Rails per consentire questo scenario.

risposta

8

Ok, dopo la ricerca di questo, ho trovato una soluzione elegante che io iniziare a utilizzare troppo:

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

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

+0

Eeeeewwww. Ma hai ragione questo sembra essere il modo in cui questo è destinato a essere gestito. –

0

Se necessari attributi nidificati possono essere ammesse come segue:

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

Per un campo che consente gli hash annidati, utilizzo la seguente soluzione:

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 

per applicarlo ad esempio, la values param, è possibile utilizzarlo in questo modo:

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