文件参数是一个字符串,而不是对象

时间:2017-11-04 00:24:03

标签: ruby-on-rails

Rails 5.1

在我的表格中,我有:

.container
  h4
    = t('fw_exports.choose_file_to_upload')
  //= form_tag url: process_imported_spreadsheet_path, html: { multipart: true }
  = form_tag({controller: :fw_exports, action: :process_imported_spreadsheet}, multipart: true)
    .form-group
      = file_field_tag :import_file
    .form_group
      = text_field_tag :screen_name_addition, nil, placeholder: "Screen Name To Add"
    = button_tag(type: 'submit', class: "btn btn-primary") do
      i.icon-ok.icon-white
      = t('fw_exports.import')

但是当我提交表格时,我会得到这些参数:

Parameters: 
  {"utf8"=>"✓", "authenticity_token"=>"...", 
  "import_file"=>"test.csv", 
  "screen_name_addition"=>"testname", 
  "button"=>""}

import_file字段是一个字符串,而不是一个对象。我相信我使用了正确的语法(我也试过了我注释掉的那一行)。

这是HTML:

<form html="{:multipart=>true}" action="/process_imported_spreadsheet" accept-charset="UTF-8" method="post">
  <input name="utf8" type="hidden" value="✓">
  <input type="hidden" name="authenticity_token" value=".....">
  <input type="file" name="import_file" id="import_file">
  <button name="button" type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i>Import</button>
</form>

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

在Rails 5.1 +

中使用form_with代替form_tag
= form_with url: process_imported_spreadsheet_path, multipart: true do |form|
  = form.import_file

这会用一种方法替换form_tagform_for。除此之外,这还解决了由form_forform_tag的不同签名引起的问题。

form_for使用html选项。 form_tag没有。

= form_tag 'foo', html: { multipart: true } do

将呈现:

<form html="{:multipart=&gt;true}" action="/foo" accept-charset="UTF-8" method="post">

因为任何没有特殊意义的选项都只是作为属性添加。奇怪的{:multipart=&gt;true}来自.to_s隐式调用哈希。

这些确实有效:

= form_tag '/foo', multipart: true } do
= form_tag {controller: :foo, action: :index }, multipart: true  do

# renders
<form enctype="multipart/form-data" action="/foo" accept-charset="UTF-8" method="post">