尝试将以前只能使用radio_button从多个项目中选择一个选项的表单转换为可以使用check_box选择多个选项的表单。
原始代码:
<% @inventory.each do |category, list| %>
<div class="col-xs-3">
<div class="form-group box">
<h5> <%="#{category.upcase}"%> </h5>
<% list.each do |thing| %>
<%= f.radio_button(:item, "#{thing}") %>
<%= f.label(:item, "#{thing}") %>
</br>
<% end %>
</div>
</div>
<% end %>
如果所有嵌套的每个组件看起来都令人困惑,那么基本上发生的事情是从库存哈希中生成多个类别的项目。每个类别在表单上看起来都不同,但对任何类别中任何项目的radio_button检查都会计为您选择的一个项目。
课程是&#34;请求&#34;此数据发布到的列是&#34;项目&#34;:
class Request < ActiveRecord::Base
validates :item, presence: true
我现在需要这样做,以便用户可以检查任何类别中的任何项目,并且所有这些项目都作为数组进行POST。我尝试用以下方法替换radio_button行:
<%= f.check_box(:item, {:multiple => true}, "#{thing}") %>
似乎它正在运行,因为我刚刚测试过并且Rails调试器显示以下内容:
request: !ruby/hash:ActionController::Parameters
item:
- '0'
- '0'
- Sleeping bag
- '0'
- Sleeping pad
但是当我点击提交按钮时,我收到错误消息,&#34;项目不能为空。&#34;
帮助?
编辑:添加控制器代码:
def new
@requestrecord = Request.new
inventory #This calls a private method that lists all the items by category and list
@pagetitle = "What would you like to borrow?"
end
def create
@requestrecord = Request.new(request_params)
inventory
@pagetitle = "What would you like to borrow?"
if @requestrecord.save
flash[:success] = "Thanks, we'll respond in a few hours. Below is the information you submitted in case you need to change anything."
@requestrecord.save_spreadsheet
RequestMailer.confirmation_email(@requestrecord).deliver
redirect_to edit_request_path(@requestrecord.edit_id)
else
render 'new'
end
end
private
def request_params
params.require(:request).permit(:email, :item, :detail, :rentdate, :edit_id)
end
答案 0 :(得分:0)
在处理数组类型的表单参数和强参数时,你犯了一个典型的错误。
你需要告诉控制器可以接受一系列“项目”。
因此,请更改request_params
liike的定义:
def request_params
params.require(:request).permit(:email, {:item => []}, :detail, :rentdate, :edit_id)
end
这个错误应该结束了。