我有一个带有几个单选按钮的窗体。它提交的参数是一个散列数组。在服务器日志中,散列数组似乎没有名称(可能是因为我需要给它一个名称(。因此,我不能告诉params.require(:availability).permit(:<HERE>)
允许它,因为我不知道在.permit()
里面放什么名字。
我试过修改私有控制器方法,确实放宽了那里的要求,但我认为这是一个破解方法,而不是一个好的解决方案。
这是我在视图中生成哈希数组的代码
<%= form_tag("/availabilities/") do |f| %>
<%= label_tag :availability %>
<% @hours.each do |hour| %>
<%= hour[:time_slot] %>
<%= radio_button_tag hour.to_s, available_in_words(hour[:time_slot_available?]) %>
<%= radio_button_tag hour.to_s, available_in_words(!hour[:time_slot_available?]) %></br>
<% end %> <!-- ends hour loop -->
<div><%= submit_tag 'Save' %></div>
<% end %> <!-- ends form -->
注意:通过此表单提交的内容与Availability
模型中的字段不匹配,因为它更原始,在提交后需要在Availability中创建/更新记录。我不确定这是否会影响
到目前为止我所知道的
我认为label_tag
会给表单参数一个名称,通过这个名称可以在params.require(:availability)
中引用它,但这导致了错误param is missing or the value is empty: availability
备注
这就是params
提交后的样子:
<ActionController::Parameters {"authenticity_token"=>"KEuNcLzuAcQj6b+0oQ0FzjOE35f1Xq3MNNomzTnC9SCML9kaWVIFgphCgDRy5cHowxQ/N4kodNIXYCAwtCPGnA==", "{:time_slot=>2020-08-22 18:00:00 +1000, :time_slot_available?=>false}"=>"Unavailable", "{:time_slot=>2020-08-22 20:00:00 +1000, :time_slot_available?=>false}"=>"Available", "commit"=>"Save", "controller"=>"availabilities", "action"=>"create"} permitted: false>
访问";authenticity_token";很简单:params[:authenticity_token]
。但我无法有意义地访问来自单选按钮的输入
name是几乎所有FormTagHelper方法的第一个参数。
radio_button_tag(name, value, checked = false, options = {})
https://api.rubyonrails.org/v5.1.7/classes/ActionView/Helpers/FormTagHelper.html#method-i-radio_button_tag
在机架(Rails位于其顶部(中,您可以使用括号通过参数传递散列:
foo[bar][a]=1&foo[bar][b]=2
将导致:
{
foo: {
bar: {
a: 1,
b: 2
}
}
}
您可以通过将哈希传递到白名单嵌套哈希。permission:
params.require(:foo).permit(bar: [:a, :b])
您可以使用空括号通过参数传递数组:
foo[bar][]=1&foo[bar][]=2
这将导致:
{
foo: {
bar: [1,2]
}
}
然后,您可以通过以下方式将阵列列入白名单:
params.require(:foo).permit(bar: [])
CCD_ 9将允许允许的标量值的数组。
我不确定@hour.to_s
到底返回了什么,但您可能需要确保它实际上适合用作formdata键/值对中的键,并且不会干扰Rack的参数解析器。