2015-05-28 4 views
6

Ich habe ein ernstes Problem mit starken Parametern. Es funktioniert ziemlich gut in meinen ungefähr 200 Aktionen, aber in einem tut es nicht, weil ich mit den Parametern dort sehr dynamisch arbeite, und ich kann es wegen des Anwendungsdesigns auch nicht ändern.Deaktivieren Sie starke Parameter für eine spezifische Aktion

Also ich möchte starke Parameter Validierung nur in dieser spezifischen Aktion deaktivieren. Gibt es eine Möglichkeit, dies zu tun?

+0

Warum können Sie 'if' an diesem bestimmten Ort nicht verwenden ??? –

+0

Weil ich nicht weiß, wie die Params benannt werden. Meine Aktion basiert auf Metaprogrammierung ... – davidb

Antwort

2

Sie können .permit! verwenden, um beliebige Schlüssel in einem Hashwert auf die weiße Liste zu setzen.

params.require(:something).permit! 

Allerdings sollte dies als extremer Code-Geruch und ein Sicherheitsrisiko behandelt werden.

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

Dies funktioniert nicht für mich, da der Name der Parameter nicht statisch definiert ist, sondern durch das angezeigte Objekt definiert wird. Ich weiß, das klingt wie ein großes Sicherheitsloch, aber ich implementierte Sicherheitsmechanismen in der Methodenlogik. Ich muss wirklich starke Parameter in einer Aktion ausschalten – davidb

+0

Die einzige Möglichkeit, die ich 'Config.action_controller.permit_all_parameters' verwenden kann, aber das ist auf einer Pro-App-Basis getan. Nicht pro Aktion. – max

+0

Ja für den Entwicklungsmodus Ich habe starke Parameter deaktiviert, aber im Produktionsmodus kann ich das nicht tun – davidb

6

Starke Parameter überschreibt die params Methode in ActionController::Base:

Nested Hashes können mit diesem Trick die weiße Liste gesetzt werden. Sie können es einfach überschreiben und es auf das zurücksetzen, was Sie selbst wollen.

So folgt aus:

class MyController < ApplicationController 
    def params 
    request.parameters 
    end 
end 

effektiv starke Parameter für alle Aktionen in Ihrem Controller deaktivieren. Sie wollten es aber nur für eine bestimmte Aktion deaktivieren, also können Sie das tun mit:

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 
Verwandte Themen