我正在尝试添加一个非常简单的数据输入表单,一个允许用户将文件上传到服务器文件系统的按钮,以便该文件的URL可以放在数据库的字段中。 / p>
到目前为止,我已经知道在_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的红宝石指南我被告知要添加类似的内容:
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如何连接到'upload'动作。我可以在日志中看到按钮按下接受文件名等,但没有迹象表明文件上传已启动或尝试。
我已经阅读了很多参考文献,他们似乎都说你需要这两件事,但(对我而言)他们并没有连接点。是的我对Ruby / Rails很新,所以我显然缺少一些基本的东西。
答案 0 :(得分: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上处理文件上载的最不推荐的方法,尤其是对于新用户。相反,设置Carrierwave,Paperclip或Dragonfly会更好。
答案 1 :(得分:1)
您是否忘记在form_for中指定multipart?
<%= form_for(@uploadfile, :html => {:multipart =>true}) do |f| %>
检查生成的表单html代码,你看到了吗?
<form ... enctype="multipart/form-data" ...>