許可されたレベルの数が実際に必要なレベルよりも多くなる可能性があるという事実に応じて解決できるため、ハッシュ内の再帰キー キーの出現をカウントし、nodes
このカウントをレベル数として使用できます。
このカウントは、実際に必要なレベルよりも多くなることに注意してください。ただし、ハッシュ内のレベル数を再帰的にカウントするよりも簡単です。
したがって、コントローラーでは次のことができます。
# 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)
そして、実際の強力なパラメータ構築コードを次のようにすることができます
# 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