2013-07-15 17 views
6

Rails 4'te ağaç yapıları için isteğe bağlı olarak derin güçlü parametreler belirtmenin bir yolu var mı? Örneğin, nasıl aşağıdaki gibi bir şey belirtmek istiyorum:Özyinalı/Ağaç güçlü parametreler gibi?

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

her düğüm bir isim niteliği bulundurmalarını sağlamak amacıyla ve düğümler bağlıyor?

+1

Bunu hiç anladınız mı? – senfo

cevap

0

Bu, güçlü parametrelerle mümkün değildir. Bunun için sade bir yakut kullanmalısın, yani paragraflarınızı to_hash ile bir hash'a dönüştürmeli ve formatı kendiniz onaylamalısınız.

3

Bunu çözmek için daha temiz bir çözüm olabilir, ancak bu benim şu andaki işim. Genel fikir, yuvalanmamın ne kadar derinleştiğini saymak ve sonra bu sayıya göre doğru iç içe geçmiş karımı otomatik olarak üretmektir. Yani bu örneği takip etmeye:

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 

(üst düzey aynı parametreleri yoktu nerede benim koduna dayalı olduğundan ben vardı gibi çalıştı beri ben bıraktım daha Yukarıdaki örnek yukarı temizlenebilir. benim sistem.)

+0

Teşekkürler. Bu beni çok fazla baş ağrısından kurtardı. Güçlü Parametreleri genişletmeye çalışarak bu soruna saldırıyordum. İzinlerin karma olarak dinamik olarak inşa edilmesi daha kolay bir yaklaşımdır. – rodamn

2
sen karma ve kullanımda sizi özyinelemeli anahtar nodes anahtarın saymasına böylece izin verilen seviyenin sayısı, gerçekte ihtiyaç seviyelerine göre daha fazla olabilir gerçeğine bağlı olarak çözebiliriz

Bu sayıların sayısı olarak sayılır.

# 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) 

: Bu sayım gerçekten ihtiyaç düzeyleri daha fazla olacak, ancak yinelemeli aşağıdaki edebilirsiniz denetleyicisi

Yani karma düzey sayısını saymak olmadığı kadar kolay olduğunu

Not Ve gerçek güçlü parametrelerin yapı kodu aşağıdaki gibi olabilir:

# 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 
İlgili konular