1

我正在尝试添加一个非常简单的数据输入表单,一个允许用户将文件上传到服务器文件系统的按钮,以便该文件的 url 可以放置在数据库的字段中。

到目前为止,我已经解决了在 _form...erb 文件中,我可以添加 file_field 助手:

<%= form_for(@business) do |f| %>
<% if @business.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@business.errors.count, "error") %> prohibited this business from being saved:</h2>

<ul>
<% @business.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>

<div class="field">
<%= f.label :deletedFlag %><br />
<%= f.check_box :deletedFlag %>
</div>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>

...

<div class="field">
<%= f.label :logoURL %><br />
<%= f.text_field :logoURL %>

    <%= f.file_field :imagefile %>
</div>

<div class="field">
<%= f.label :streetAddress %><br />
<%= f.text_area :streetAddress %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>

这给了我一个带有“选择文件”按钮的表单。单击它可以选择文件。伟大的。

现在,从位于http://guides.rubyonrails.org/form_helpers.html#uploading-files的 ruby​​ 指南中,我被告知要添加以下内容:

def upload
  uploaded_io = params[:business][:imagefile]
  File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file|
    file.write(uploaded_io.read)
  end
end

到我的控制器。

我还没有弄清楚 file_field 如何连接到那个“上传”动作。我可以在日志中看到按钮按下接受文件名等,但没有迹象表明文件上传已开始或尝试。

我已经阅读了许多参考资料,它们似乎都说您需要这两件事,但是(对我而言)它们并没有将这些点联系起来。是的,我对 Ruby/Rails 很陌生,所以我显然缺少一些基本的东西。

4

2 回答 2

2

您是否忘记像这样在您的 form_for 中指定 multipart ?

<%= form_for(@uploadfile, :html => {:multipart =>true}) do |f| %>

检查生成的表单html代码,你看到了吗?

<form ... enctype="multipart/form-data" ...>
于 2013-05-31T06:45:49.590 回答
1

您可能需要设置一个路由,以便 Rails 可以将表单中的请求传递到您的控制器,然后设置您的表单以使用该路由:

# config/routes.rb
post '/upload' => 'mycontroller#upload'

# app/views/some_model/new.html.erb
<%= form_for something, url: upload_path do |f| %>
...

不过,这可能是在 Rails 上处理文件上传最不推荐的方式,尤其是对于新用户。你最好设置CarrierwavePaperclipDragonfly

于 2013-05-31T03:58:37.717 回答