0

从表单提交的内容与 Rails 服务器识别为参数的内容之间似乎存在不一致...除非我做错了什么/不了解参数数组的工作原理...这是可能的。

这就是我制作复选框的方式:

    current_event.competitions.map { |competition|
        content_tag(:div, class: "checkbox"){
            check_box_tag("attendance[competition_ids]", competition.id, @attendance.competitions.include?(competition.id)) + 
            label("attendance[competition_ids]", competition.id, label_with_price(competition))
        }
    }.join.html_safe

这就是 chrome web 检查器所说的被发送到服务器的内容:

attendance[competition_ids]:1
attendance[competition_ids]:2
attendance[competition_ids]:3

但是 Rails 抛出了这个错误:

ActiveModel::ForbiddenAttributesError

这是我的参数辅助方法是我的控制器

params[:attendance].permit(:package, :level, competition_ids: [])

由 rails 标识的参数: 参数:

{"utf8"=>"✓",
 "authenticity_token"=>"qZ1gtwZoXgs9P0HdberzrsMO7L1NftmB8yGso0WquOY=",
 "attendance"=>{"competition_ids"=>"3"},
 "discounts"=>[""],
 "commit"=>"Register"}

我的参数不应该看起来更像:

"attendance"=>{"competition_ids"=>["1","2","3"]}

?

4

1 回答 1

1

其实并没有什么矛盾。所有复选框都具有相同的名称属性,因此您只能看到“最后一个”值。它基本上是将参数值设置为 1,然后是 2,然后是 3。

如果你想要一个数组,name 属性必须以 结尾[],即attendance[competition_ids][]

这将在服务器端被解释为一个值数组。


如果你认为它是一个 Ruby 哈希,那是有道理的

params["attendance"]["competition_ids"] = 1
params["attendance"]["competition_ids"] = 2
params["attendance"]["competition_ids"] = 3

同一个键被一次又一次地覆盖。但是如果你[]在名字中加上 ,行为更接近于

params["attendance"]["competition_ids"] = []
params["attendance"]["competition_ids"] << 1
params["attendance"]["competition_ids"] << 2
params["attendance"]["competition_ids"] << 3
于 2013-11-02T21:51:36.053 回答