ActionController :: Parameters - Permit方法不返回嵌套属性的参数

时间:2015-09-11 06:17:28

标签: ruby-on-rails ruby strong-parameters

我有点问题。你能告诉我为什么permit方法不能从下面的代码返回第二个例子中的data_set_users_attributes和data_set_synch_agents_attributes吗?这很奇怪。所有数据看起来都很好,也允许参数。两个parameters_hash都是从同一个表单发送的,两个permit数据都是由同一个函数创建的。

编辑:我使用Ruby 2.3.0和rails 4.2.4

require 'rails/all'
# Params passes
_permit = [
    "configuration_id",
    "max_packages_on_server",
    "reports_synch_interval_min",
    {
        "data_set_users_attributes" => [
            {
                "0" => [
                    "user_id",
                    "send_alerts",
                    "_destroy"
                ]
            },
            {
                "2015_09_09_15_21_50" => [
                    "user_id",
                    "send_alerts",
                    "_destroy"
                ]
            }
        ]
    },
    {
        "data_set_synch_agents_attributes" => [
            {
                "0" => [
                    "synch_agent_id",
                    "max_idle_on_data_set",
                    "_destroy"
                ]
            },
            {
                "2015_09_09_15_21_51" => [
                    "synch_agent_id",
                    "max_idle_on_data_set",
                    "_destroy"
                ]
            }
        ]
    }
]

parameters_hash = {
    "action" => "create",
    "commit" => "Save",
    "controller" => "data_sets",
    "data_set" => {
        "configuration_id" => "",
        "data_set_synch_agents_attributes" => {
            "0" => {
                "_destroy" => "false",
                "max_idle_on_data_set" => "-1",
                "synch_agent_id" => "1"
            },
            "2015_09_09_15_21_51" => {
                "_destroy" => "",
                "max_idle_on_data_set" => "-1",
                "synch_agent_id" => "2"
            }
        },
        "data_set_users_attributes" => {
            "0" => {
                "_destroy" => "false",
                "send_alerts" => "1",
                "user_id" => "1"
            },
            "2015_09_09_15_21_50" => {
                "_destroy" => "",
                "send_alerts" => "1",
                "user_id" => "2"
            }
        },
        "max_packages_on_server" => "",
        "reports_synch_interval_min" => ""
    }
}

params = ActionController::Parameters.new(parameters_hash)
p params.require(:data_set).permit(_permit)

# Params not passes
_permit = [
    "configuration_id",
    "max_packages_on_server",
    "reports_synch_interval_min",
    {
        "data_set_users_attributes" => [
            {
                "0" => [
                    "user_id",
                    "send_alerts",
                    "_destroy"
                ]
            },
            {
                "1" => [
                    "user_id",
                    "send_alerts",
                    "_destroy"
                ]
            }
        ]
    },
    {
        "data_set_synch_agents_attributes" => [
            {
                "0" => [
                    "synch_agent_id",
                    "max_idle_on_data_set",
                    "_destroy"
                ]
            },
            {
                "1" => [
                    "synch_agent_id",
                    "max_idle_on_data_set",
                    "_destroy"
                ]
            }
        ]
    }
]

parameters_hash = {
    "action" => "create",
    "commit" => "Save",
    "controller" => "data_sets",
    "data_set" => {
        "configuration_id" => "",
        "data_set_synch_agents_attributes" => {
            "0" => {
                "_destroy" => "false",
                "max_idle_on_data_set" => "-1",
                "synch_agent_id" => "1"
            },
            "1" => {
                "_destroy" => "false",
                "max_idle_on_data_set" => "-1",
                "synch_agent_id" => "2"
            }
        },
        "data_set_users_attributes" => {
            "0" => {
                "_destroy" => "false",
                "send_alerts" => "1",
                "user_id" => "1"
            },
            "1" => {
                "_destroy" => "false",
                "send_alerts" => "1",
                "user_id" => "2"
            }
        },
        "max_packages_on_server" => "",
        "reports_synch_interval_min" => ""
    }
}

params = ActionController::Parameters.new(parameters_hash)
p params.require(:data_set).permit(_permit)

任何帮助将不胜感激。 最好的问候

1 个答案:

答案 0 :(得分:0)

如果我做对了,你需要试试这个:

params.require(:data_set).permit(
  :max_packages_on_server,
  :reports_synch_interval_min,
  data_set_synch_agents_attributes: [:synch_agent_id, :max_idle_on_data_set, :_destroy],
  data_set_users_attributes: [:send_alerts, :user_id, :_destroy])

获取更新模型的参数。