当用户提交空白表单

时间:2015-08-12 15:26:32

标签: forms ruby-on-rails-4 web

我有以下表格:

  # controller
  def edit
    @doc = HomeworkDocument.find(params[:id])
  end

  # view
  <%= form_for @doc, 
      url: student_homework_document_path(student_id: @doc.submitter_id,
                                           id: @doc.id),
      html: { multipart: true } do |f| %>

  <%= f.label :file1 %>
  <%= f.file_field :file1 %>

  <%= f.label :file2 %>
  <%= f.file_field :file2 %>

  <%= f.submit "Submit" %>

当用户提交file1file2中的一个或两个时,表单正常。但是,当用户单击“提交而没有任何文件”时,将引发异常:

param is missing or the value is empty: homework_document

由于我强大的参数规范:

def doc_grader_params
  params.require(:homework_document)
        .permit(:file1, :file2)
end

传递的参数是(通知没有传递homework_document):

参数:

{"utf8"=>"✓",
 "_method"=>"patch",
 "authenticity_token"=>"QJirOW/HQ3sv8AR/yArW6cQ2bmvz0j5D8G6czu45lLA=",
 "commit"=>"Submit grading",
 "student_id"=>"4",
 "id"=>"21"}

为什么会发生这种情况以及如何在homework_document中包含(空)param哈希,即使用户提交空白表单也是如此?

1 个答案:

答案 0 :(得分:0)

要包含空homework_document哈希,您有两个选择:

  1. 假设您 想要覆盖:file1, :file2属性,如果提交为空,请在表单中添加一个空hidden_field,并允许通过传入强参数,但对参数几乎没有任何作用。像这样:
  2. <%= hidden_field_tag 'homework_document[placeholder]', 'do nothing' %>

    def doc_grader_params
      params.require(:homework_document)
            .permit(:file1, :file2, :placeholder)
    end
    
    1. 如果你想要覆盖属性(删除文件,如果为空),请放置两个名为hidden_field的{​​{1}}和homework_document[file1] 之前的homework_document[file2] 文件输入并将其值设置为''(或者您拥有的默认值)。因为参数提取得到查询字符串中任何重复键的最后一次出现,所以这应该有效。
    2. 此方法类似于以下中概述的check_box空提交方法: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box