2017-11-15 1 views
1

Ich habe ein Modell, QueryElement, mit einer Kindklasse, QueryGroup. QueryGroup kann verschachtelte QueryElements enthalten.Rails starke Parameter für unendlich nestbare Modell

Say QueryGroup hat einen Eigenschaftsnamen und QueryElement hat eine Eigenschaft Filter (nur zum Beispiel)

Also für starke Parameter Ich habe so etwas wie:

params.fetch(:query).permit(:name, :filter, :query_elements => [:name, :filter, :query_elements => [...] 

Und so weiter.

Ich könnte alle (die Überwindung der Sicherheit von starken Parametern, die ich lieber vermeiden möchte), oder manuell Schritt durch den Baum, der viel langsamer ist. Das ist meine derzeitige Herangehensweise.

Gibt es einen besseren Weg?

+0

was meinst du, "viel langsamer"? –

+0

Diese Objekte neigen dazu, sehr tief verschachtelt zu werden. Daher ist es nicht ideal, für jede Anfrage durch diese großen Bäume zu gehen. – user1456632

+0

Wie denken Sie, dass das Whitelisting funktionieren würde? Das Durchschreiten der Struktur ist unvermeidlich. –

Antwort

0

Etwas wie folgt aus:

REQUIRED = %i(name).freeze 
ALLOWED = (%i(filter query_elements) + REQUIRED).freeze 
MAX_DEPTH = 5 

def ensure_params(hash, nest_level = 0) # ah I never come up with good names... 
    raise 'you went too deep man' if nest_level > MAX_DEPTH 
    hash.fetch_values(*REQUIRED) 
    hash[:query_elements] = ensure_params(hash[:query_elements], nest_level + 1) if hash[:query_elements] 
    hash.slice(*ALLOWED) 
end 

In IRB:

> ensure_params({ :filter => 2, :name => 'test', unpermitted_param: :something, :query_elements => { filter: 3, name: 'test', nested_unpermitted: 13 } }) 
# => {:filter=>2, :query_elements=>{:filter=>3, :name=>"test"}, :name=>"test"} 
> ensure_params({ name: 1, query_elements: { notname: 1 } }) 
KeyError: key not found: :name 
> MAX_DEPTH = 3 
# => 3 
> ensure_params({ name: 1, query_elements: { name: 1, query_elements: { name: 1, query_elements: { name: 1, query_elements: { name: 1, query_elements: { name: 1 } } } } }}) 
RuntimeError: you went too deep man 

Es gibt wohl einige Verbesserungen, die getan werden könnte, wie die Schlüssel zu Symbolen konvertieren, eine bessere Fehlermeldung Ihnen zu sagen, Auf welcher Ebene gibt es einen fehlenden Schlüssel usw.

Verwandte Themen