2013-07-16 2 views
15

Ho questo nel mio controller:Come creare una chiave opzionale per i parametri forti e ancora filtrare i parametri annidati al suo interno?

params.require(:item).permit! 

Supponiamo che questa spec rspec:

put :update, id: @item.id, item: { name: "new name" } 

Esso funziona come previsto, nessun errore. Tuttavia, se uso questo:

put :update, id: @item.id, item: nil 

ottengo ActionController::ParameterMissing che io non voglio ottenere. Ha a che fare con i macro del controller che uso per altre azioni e attraverso il quale non posso controllare i parametri inviati (le macro controllano le credenziali dell'utente, quindi non mi interessa davvero testare un'azione #update, piuttosto sto solo testando before_filters per questo).

Quindi la mia domanda è: come faccio a rendere params[:item] opzionale, ma ancora filtro gli attributi al suo interno se è presente?

+4

Alcune buone idee a https://github.com/rails/rails/issues/9534. Fondamentalmente il suggerimento è di usare '# fetch' invece di' # require' dato che ha un secondo parametro per default, ad esempio 'params.fetch (: item, {}). Permit!'. – mtjhax

+0

@mtjhax fantastico, grazie! varrebbe la pena di dare una risposta. – srecnig

risposta

25

Che dire:

params.require(:item).permit! if params[:item]

Non è possibile richiedere un parametro opzionale. Questo è contraddittorio.

Edit: come mtjhax menzionato nel suo commento, non c'è consigliare dai here utilizzare fetch invece: params.fetch(:item, {}).permit!

+1

Penso che tu abbia frainteso la sua domanda. È perfettamente valido voler richiedere il contenitore principale (: item) mentre si rendono solo alcuni dei suoi attributi secondari interni facoltativi, che a parte l'uso di 'params.require (: item) .permit!' (Che consente qualsiasi parametro purché sono all'interno di ': item' e': item' esiste non sembra possibile in modo granulare –

+0

@OlivierLacan rileggendolo, penso che potresti essere corretto, anche se ora sono confuso perché ha accettato la mia risposta se non ha risolto il suo problema. –