Rails:图片上传(不插件)

时间:2012-11-16 18:29:48

标签: ruby-on-rails image forms upload

我有一张表,存储有关酱汁的信息。每个酱都有一个图像资产文件夹内的图像,在一个名为酱料的文件夹中。所有酱料文件的名称相同; 例如assets/images/sauces/sauces_piri.png

我想要做的就是在创建发生的表单中上传一个.png文件,在pic_url的字段中,图像的名称与酱料一起存储/因此当我想要它时它被正确定向显示图像。

目前管理员必须使用域文件管理将图像物理上传到正确的位置,并在创建新酱汁时输入“sauces / sauces_name.png”。

添加新酱汁的表格:

<%= error_messages_for(@sauce) %>
   <table summary="Sauces Form Fields">
    <tr>
     <th><%= f.label(:name,"Sauce Name") %></th>
     <td><%= f.text_field(:name) %></td>
    </tr>
    <tr>
     <th><%= f.label(:description, "Description") %></th>
     <td><%= f.text_area(:description, :size => '40x5') %></td>
    </tr>
    <tr>
     <th><%= f.label(:heat_level, "Heat Level") %></th>
     <td><%= f.select(:heat_level,{ 1 => "1", 2 => "2", 3 => "3", 4 => "4", 5 => "5"}) %></td>
   </tr>
   <tr>
    <th><%= f.label(:pic_url, "Picture URL") %></th>
    <td><%= f.text_field(:pic_url) %></td>
   </tr>
   <tr>
    <th><%= f.label(:title_colour, "Title Colour") %></th>
    <td><%= f.text_field(:title_colour) %></td>
   </tr>
   <tr>
    <th><%= f.label(:description_colour, "Desc Colour") %></th>
    <td><%= f.text_field(:description_colour) %></td>
   </tr>
  </table>

因此,如果不使用回形针等插件,如何启用图像上传,然后将文件存储在正确的位置,并且还在表字段pic_url中存储foldername / filename.png?

1 个答案:

答案 0 :(得分:2)

我不清楚你遇到了什么问题。因此,我将在上传文件时发布一个示例表单。

<%= form_for(:uploaded_data_file, :url => upload_files_path(:params => params) ,  :remote => true, :html => { :multipart => true } ) do |f| %>
  <%= f.label "Upload" %><br />
  <%= f.file_field :location %>
<% end %>

您必须定义将在此示例中存储图像的函数的路径,它被称为upload_files_path,我们将params传递给它。然后重新启动webapp以获取新路由。

在控制器中,您可以保存文件及其详细信息

获取文件名

params[:uploaded_data_file][:location].original_filename

获取文件本身并保存

File.open("where/to/save", "wb") { |f| f.write(params[:uploaded_data_file][:location].read) }

要确保它是.png,您可以进行一些正则表达式检查

if(name =~ /.png$/i) # for more than one type do (name =~ /.jpeg$|.png$/i)

要执行其他操作,请查看params并进行所需的更改。

对于上班路线,您可以查看http://edgeguides.rubyonrails.org/routing.html#adding-more-restful-actions

resources :posts do
  collection do
    get :upload_files # will create upload_files_posts_path
  end
end

match '/upload_files', :to => 'controller_name#method_name' # 'posts#upload_files'

或者

<% form_tag({:action => 'upload_file'}  #will use the correct controller based on the form