我有以下表格:
# 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" %>
当用户提交file1
和file2
中的一个或两个时,表单正常。但是,当用户单击“提交而没有任何文件”时,将引发异常:
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
哈希,即使用户提交空白表单也是如此?
答案 0 :(得分:0)
要包含空homework_document
哈希,您有两个选择:
:file1, :file2
属性,如果提交为空,请在表单中添加一个空hidden_field
,并允许通过传入强参数,但对参数几乎没有任何作用。像这样: <%= hidden_field_tag 'homework_document[placeholder]', 'do nothing' %>
def doc_grader_params
params.require(:homework_document)
.permit(:file1, :file2, :placeholder)
end
hidden_field
的{{1}}和homework_document[file1]
之前的homework_document[file2]
文件输入并将其值设置为''
(或者您拥有的默认值)。因为参数提取得到查询字符串中任何重复键的最后一次出现,所以这应该有效。 此方法类似于以下中概述的check_box空提交方法: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-check_box