用户使用check_box表单助手选择多个项目;将数据作为数组POST

时间:2014-03-24 15:04:08

标签: ruby-on-rails forms checkbox form-helpers

尝试将以前只能使用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

1 个答案:

答案 0 :(得分:0)

在处理数组类型的表单参数和强参数时,你犯了一个典型的错误。

你需要告诉控制器可以接受一系列“项目”。

因此,请更改request_params liike的定义:

def request_params
    params.require(:request).permit(:email, {:item => []}, :detail, :rentdate, :edit_id)
end

这个错误应该结束了。