在Ruby on Rails上通过form_tag表单上传文件

时间:2012-12-16 07:16:07

标签: ruby-on-rails forms tags ruby-on-rails-3.2

我想在Rails 3.2.8上使用tag_form创建一个简单的文件上传器 但是当我尝试提交图像文件时,我收到错误消息

错误消息(当我尝试提交图片文件时)

  

CoursesController#attachment中的NoMethodError   undefined方法`original_filename'代表“2012-03-02 21.53.55.jpg”:String

----- BEGIN P.S.(20121216 19:32)-----
要么 错误消息(当我在show.html.erb上添加“:multipart => true”时)

  

在CoursesController#attachment中编码:: UndefinedConversionError   “\ xFF”从ASCII-8BIT到UTF-8

-----结束P.S. -----

程序似乎认为该文件为String?
视图文件中可能存在一些问题。

如果你帮我解决这个问题我会很感激的。这是我的代码。


应用/视图/ show.html.erb

<%= form_tag(attachment_course_path, :action=>'attachment') do %>
<div class="field">
  <%= label_tag :file %>
  <%= file_field_tag :file %>
</div>
<div class="actions">
  <%= submit_tag 'Submit' %>
</div>
<% end %>


应用/控制器/ courses_controller.rb

def attachment
  t = Time.now.strftime("%Y%m%d%H%M%S")
  uploaded_io = params[:file]
  File.open(Rails.root.join('public', 'upload', uploaded_io.original_filename), 'w') do |file|
    file.write(uploaded_io.read)
  end
end


配置/ routes.rb中

resources :courses, :only => [ :show ] do
  member do
    post :attachment
  end
end

2 个答案:

答案 0 :(得分:3)

似乎表单没有发送带请求的文件。你需要设置:multipart =&gt;在form_tag中为true。

答案 1 :(得分:0)

问题与RoR upload Undefined encoding conversion

类似

:multipart => true中设置form_tag后,您需要以二进制模式('wb'而非'w')打开文件:

应用/控制器/ courses_controller.rb

...
File.open(Rails.root.join('public', 'upload', uploaded_io.original_filename), 'wb') do |file|
  file.write(uploaded_io.read)
end
...