2013-07-15 11 views
6

Gibt es eine Möglichkeit, beliebig starke Parameter für Baumstrukturen in Rails 4 anzugeben? Zum Beispiel, wie würde ich etwas wie folgt angeben:Rekursive/Baum wie starke Parameter?

{ 
    "node": { 
    "name": "parent", 
    "nodes": [ 
     { "name": "child1", "nodes": []}, 
     { "name": "child2", "nodes": [ 
     {"name": "grandchild", "nodes": []} 
     ]} 
    ] 
    } 
} 

Um jedem Knoten ein Namensattribut und ein Knoten Attribut zu haben?

+1

Haben Sie jemals herausgefunden, diese? – senfo

Antwort

0

Dies ist mit starken Parametern nicht möglich. Sie sollten plain ruby ​​dafür verwenden, d. H., Sie konvertieren Ihre Parameter in einen Hash mit to_hash und validieren das Format selbst.

3

Es mag eine sauberere Lösung geben, aber das ist meine derzeitige Arbeit. Die allgemeine Idee besteht darin, zu zählen, wie tief meine Verschachtelung ist, und dann automatisch den korrekten verschachtelten Hash basierend auf dieser Nummer zu generieren. So Ihrem Beispiel zu folgen:

def count_levels(node_params) 
    if !node_params[:nodes].nil? 
    max = 0 
    node_params[:node_parameters].each do |child_params| 
     count = count_levels(child_params[1]) 
     max = count if count > max 
    end 
    return max + 1 
    else 
    return 0 
    end 
end 

def node_params 
    node_attributes_base = [:id, :name] 
    nodes = [] 
    (1..count_levels(params[:node])).each do |val| 
    nodes = node_attributes_base + [node_attributes: nodes] 
    end 
    params.require(:node).permit(:id, :name, node_attributes: nodes) 
end 

(Das obige Beispiel gereinigt werden kann mehr, da es auf meinem Code basiert, wobei die obere Ebene nicht die gleichen Parameter haben habe ich es gelassen, wie ich es hatte, da sie gearbeitet. mein System.)

+0

Danke. Das hat mir Kopfschmerzen erspart. Ich habe dieses Problem angegriffen, indem ich versucht habe, Strong Parameters zu erweitern. Das Konstruieren des Hashes "Genehmigungen" ist ein einfacherer Ansatz. – rodamn

2

Sie durch in Abhängigkeit von der Tatsache lösen kann, dass Anzahl der erlaubten Niveau als das Niveau, das Auftreten des rekursiven Schlüssel nodes Schlüssel zählen können Sie tatsächlich benötigen, so dass Sie in Ihrem Hash und Verwendung mehr sein kann dies zählt als Anzahl der Ebenen.

Beachten Sie, dass diese Zählung wird mehr sein als die Ebenen, die Sie wirklich brauchen, aber es ist einfacher, als rekursiv Anzahl der Ebenen in der

Hash zählen

So in Ihrem Controller können Sie die folgenden Schritte aus:

# your_controller.rb 
# include RecursiveParametersBuilder 
recursive_nodes_attr = build_recursive_params(
    recursive_key: 'nodes', 
    parameters: params, 
    permitted_attributes: [:name] 
) 
params.require(:model_name).permit(:name, nodes: recursive_nodes_attr) 

Und haben die tatsächlichen starken Parameter Bau-Code wie folgt sein kann

# helper module 
module RecursiveParametersBuilder 
    # recursive_path = [:post] 
    # recursive_key = :comment_attributes 
    # recursive_node_permitted_params = [:id, :_destroy, :parameterized_type, :parameterized_id, :name, :value, :is_encrypted, :base_param_id, :parent_param_id] 
    # 
    def build_recursive_params(recursive_key:, parameters:, permitted_attributes:) 
    template = { recursive_key => permitted_attributes } 

    nested_permit_list = template.deep_dup 
    current_node = nested_permit_list[recursive_key] 

    nested_count = parameters.to_s.scan(/#{recursive_key}/).count 
    (1..nested_count).each do |i| 
     new_element = template.deep_dup 
     current_node << new_element 
     current_node = new_element[recursive_key] 
    end 
    nested_permit_list 
    end 
end 
Verwandte Themen