2015-05-28 17 views
6

Ho un problema serio con parametri forti. Funziona abbastanza bene nelle mie circa 200 azioni, ma in una cosa non funziona perché sto lavorando in modo molto dinamico con i parametri lì e non posso nemmeno cambiarlo a causa della progettazione delle applicazioni.Disabilitare i parametri forti per un'azione specifica

Quindi voglio disabilitare la validazione dei parametri forti solo in questa specifica azione. C'è un modo per fare questo?

+0

Perché non puoi usare 'se' in questo specifico luogo ??? –

+0

Perché non so come saranno nominati i param. La mia azione si basa sulla metaprogrammazione ... – davidb

risposta

2

È possibile utilizzare .permit! per autorizzare qualsiasi chiave in un hash.

params.require(:something).permit! 

Tuttavia questo dovrebbe essere trattato come un odore estremo del codice e un rischio per la sicurezza.

hash possono essere nidificate whitelist con questo trucco:

params.require(:product).permit(:name, data: params[:product][:data].try(:keys)) 
+0

Questo non funzionerà per me perché il nome dei parametri non è definito staticamente, sono definiti dall'oggetto visualizzato. So che questo sembra un grande buco di sicurezza, ma ho implementato meccanismi di sicurezza nella logica del metodo. Ho davvero bisogno di disattivare i parametri forti in un'unica azione – davidb

+0

L'unico modo che posso pensare di usare 'config.action_controller.permit_all_parameters', ma che viene fatto su base per-app. Non per azione. – max

+0

Sì per la modalità di sviluppo ho disabilitato i parametri forti ma di causa non riesco a farlo in modalità di produzione – davidb

6

parametri Forti ridefinisce il metodo params in ActionController::Base. Puoi semplicemente sovrascriverlo e reimpostarlo su ciò che desideri.

Quindi questo:

class MyController < ApplicationController 
    def params 
    request.parameters 
    end 
end 

in modo efficace disabilitare i parametri di forza per tutte le azioni nel vostro controller. Volevi disabilitarlo solo per una determinata azione, quindi puoi farlo con:

class MyController < ApplicationController 
    before_action :use_unsafe_params, only: [:particular_action] 

    def params 
    @_dangerous_params || super 
    end 

    def particular_action 
    # My params is unsafe 
    end 

    def normal_action 
    # my params is safe 
    end 

    private 

    def use_unsafe_params 
    @_dangerous_params = request.parameters 
    end 
end