7

Rails 4のツリー構造に任意の深い強力なパラメータを指定する方法はありますか? たとえば、次のように指定するにはどうすればよいですか。

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

各ノードに名前属性とノード属性を持たせるには?

4

3 に答える 3

3

許可されたレベルの数が実際に必要なレベルよりも多くなる可能性があるという事実に応じて解決できるため、ハッシュ内の再帰キー キーの出現をカウントし、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
于 2016-04-28T14:54:15.383 に答える
0

これは、強力なパラメーターでは不可能です。そのためにはプレーンなルビを使用する必要があります。つまり、パラメーターをハッシュに変換しto_hash、フォーマットを自分で検証します。

于 2013-08-16T13:17:33.593 に答える