【问题标题】:Rails Form with File Input Field - File just Name as String带有文件输入字段的 Rails 表单 - 文件只是名称为字符串
【发布时间】:2018-07-25 22:26:52
【问题描述】:

我想在我的表单中嵌入一个文件输入字段。 但是在提交时,参数值只是文件名,没有 StringIO 或其他任何东西,只是一个带有 Filename 的字符串。

表格:

    <%= form_tag(controller: 'search', action: 'confirm_new_search', method: 'post', multipart: true) do %>
        [....]
        <div class="custom-file field" id="inc_form">
          <%= file_field :post, :file_inc_sellerslist, class: "custom-file-input" %>
          <label class="custom-file-label" for="file_inc_sellerslist">
            <%= t('dashboard.new_search.extra_search_options_entries.choose_file') %>
          </label>
        </div>
        [....]

那里有什么问题?

【问题讨论】:

    标签: ruby-on-rails ruby forms input file-upload


    【解决方案1】:

    你也可以使用

    form_tag({controller: 'search', action: 'confirm_new_search'}
    , method: 'post', html: { multipart: true })
    

    我遇到了同样的问题,它对我有用

    【讨论】:

      【解决方案2】:

      您的form_tag() 语法不正确。 form_tag 接受两个哈希作为参数:一个用于 url,一个用于 html 属性。

      form_tag(url_for_options = {}, options = {}, &block)

      启动一个表单标签,将动作指向一个配置了 url_for_options 的 url,就像 ActionController::Base#url_for 一样。方法 表单默认为 POST。

      选项

      :multipart - 如果设置为 true,则 enctype 设置为 “多部分/表单数据”。

      :method - 提交表单时使用的方法,通常是 “获取”或“发布”。如果使用“patch”、“put”、“delete”或其他动词, 添加了一个名为 _method 的隐藏输入来模拟动词 over 发帖。

      :authenticity_token - 在表单中使用的真实性令牌。仅使用 如果您需要传递自定义真实性令牌字符串,或者不添加 authenticity_token 字段(通过传递 false)。远程表格可以 通过设置省略嵌入的真实性令牌 config.action_view.embed_authenticity_token_in_remote_forms = false。 当您对表单进行片段缓存时,这很有帮助。远程表格 从元标记中获取真实性令牌,因此嵌入是 除非您支持没有 JavaScript 的浏览器,否则不必要。

      :remote - 如果设置为 true,将允许 Unobtrusive JavaScript 驱动程序来控制提交行为。默认情况下,此行为是 ajax 提交。

      :enforce_utf8 - 如果设置为 false,则不会显示名为 utf8 的隐藏输入 输出。

      任何其他键都会为标签创建标准 HTML 属性

      http://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormTagHelper.html#method-i-form_tag

      以下对我有用:

      <%= form_tag({controller: 'search', action: 'confirm_new_search'},
        method: 'post', 
        multipart: true) do %>
      

      以下是您的 form_tag() 调用发生的示例:

      def go(x={}, y={})
        p x
        p y
      end
      
      go(a: 1, b:2, c:3)
      
      --output:
      {:a=>1, :b=>2, :c=>3}
      {}
      

      因此,您为form_for() 指定的所有键/值对都被收集到一个散列中并分配给参数变量url_for_options。其结果是您的 form_tag() 没有将 html 选项 multipart 设置为 true。如果您查看 html 的源代码,您会看到:

      <form action="/search/confirm_new_search?method=post&amp;multipart=true" 
            accept-charset="UTF-8" 
            method="post">
      

      如果您将该 html 与您的 form_tag() 通话进行比较:

      form_tag(controller: 'search', 
               action: 'confirm_new_search', 
               method: 'post', 
               multipart: true)
      

      很明显,最后两个键/值对被添加到 url 中的查询字符串中。该行为似乎没有在任何地方记录,但规则似乎是:对于url_for() 无法识别的任何键,该键和相应的值被添加到查询字符串中。而且,查询字符串中的键/值对与&lt;form&gt; 标记的html 属性无关。

      【讨论】:

        猜你喜欢
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 2015-09-02
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        相关资源
        最近更新 更多