我正在上传以下段落的图片:
Parameters: {"url"=>"https://bucket.s3.amazonaws.com/image014.jpg",
"filepath"=>"/uploads%2F1381509934146-1t5a44loikwhr529-1d68490743e05a1287fea45ed4ed9e59%2Fslide0005_image014.jpg",
"filename"=>"slide0005_image014.jpg",
"filesize"=>"30807",
"filetype"=>"image/jpeg",
"unique_id"=>"1t5a44loikwhr529",
"choice"=>["https://bucket.s3.amazonaws.com/image014.jpg"]}
这是我的表格:
<%= s3_uploader_form callback_url: choices_url, callback_param: "choice[]", id: "s3-uploader" do %>
<%= file_field_tag :file, multiple: true %>
<button type="submit" class="btn btn-primary start">
<% end %>
在我的控制器中,我有:
#app/controllers/choices_controller
def create
@choice = Choice.create!(choice_params)
if @choice.persisted?
respond_to do |format|
format.html { redirect_to choices_path }
format.json { head :no_content }
end
end
end
def choice_params
params.require(:choice).permit(:url, :filepath, :filename, :filesize, :filetype)
end
但是,它会返回错误:
NoMethodError (undefined method `permit' for #<Array:0x007f903e380060>):
app/controllers/choices_controller.rb:49:in `choice_params'
app/controllers/choices_controller.rb:24:in `create'
你能告诉我这里做错了什么吗?我想做的就是:
1)将“url”参数添加到DB 2)标题化“文件名”参数,然后将其提交给数据库。
非常感谢!
答案 0 :(得分:1)
require
的工作方式与params[:some_key]
类似,但在返回的值为空时会引发ActionController::ParameterMissing
。
这很方便,因为它允许使用rescue_from
在这种情况下呈现400: bad request
错误。
所以你必须包裹你的参数,这样当你打电话给require(:choice)
时,你会得到一个哈希值。
不幸的是,s3_upload_form
似乎不支持与form_for
相同的构建器语法,这将允许您执行以下操作:
<%= form_for :s3_upload do |f| %>
<% f.file_field :file %>
<% end %>
导致像这样的params哈希:
{ s3_upload: {file: <SomeFile ...>} }
所以我的建议只是放弃require
调用,并将:choice
放在传递给permit
的其他参数上。
如果您仍希望获得require
方法的好处(即检查是否缺少参数),您可以随时执行以下操作:
def choice_params
params.permit(:foo, :bar, :baz).tap do |p|
p.each_key{ |k| p.require k }
end
end
如果缺少任何允许的参数,这将引发异常。