paperclip多文件上传

来源:互联网 发布:家用加湿器知乎 编辑:程序博客网 时间:2024/06/05 03:43

在Rails程序里上传文件你会用什么呢?反正我是用的paperclip,至少它支持Ruby1.9和Rails3。

这是tutorial,所以你只需要按照步骤来就能完成一个可运行的DEMO。前提是我用的ruby 1.9.2preview3和Rails 3.0.0.beta4,你可以与我不同,不过我不保证会顺利。

我要说的是Post与Asset之间has_many的association,就是一个Post有很多的Asset。如果你只想要has_one的可以直接参看paperclip的快速入门

准备工作

我们需要一个新的Rails项目weblog,然后添加一个Post

1gem install paperclip
2rails weblog
3cd weblog
4rails g scaffold post title:string body:text
5rake db:migrate
6rails s

好的,访问http://localhost:3000/posts,现在一个简单的blog就完成了。

添加Asset模型

首先在Gemfile里添加一行gem 'paperclip',然后自然是生成一个Model了

1rails g model asset data_file_name:string data_content_type:string data_file_size:integer data_updated_at:datetime post_id:integer
2rake db:migrate

接下来是声明相应的从属关系

01# app/models/post.rb
02class Post < ActiveRecord::Base
03  has_many :assets
04  accepts_nested_attributes_for :assets
05end
06 
07# app/models/asset.rb
08class Asset < ActiveRecord::Base
09  belongs_to :post
10  has_attached_file :data:url => "/system/:attachment/:id/:style/:filename"
11end

简单修改Controller

打开PostsController,很SB的这样修改一下new方法,只是DEMO!!!

01def new
02  @post = Post.new
03  @post.assets.build
04  @post.assets.build
05 
06  respond_to do |format|
07    format.html # new.html.erb
08    format.xml  { render :xml => @post }
09  end
10end

简单修改View

在_form.html.erb里面添加下面一块内容

1<%= f.fields_for :assets do |asset_form| %>
2  <div class="asset field">
3    <%= asset_form.file_field :data %>
4  </div>
5<% end %>

哦,由于要上传文件,那自然要这样修改一下_form.html.erb

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

然后在展示页面show.html.erb添加如下内容

1<p>
2  <b>Assets:</b>
3  <ul>
4    <% @post.assets.each do |asset| %>
5      <li><%= asset.data.url %></li>
6    <% end %>
7  </ul>
8</p>

好的,现在可以用了,为保证tutorial的简单明了,很粗糙很粗糙。。。

原文转自:http://abitno.me/has-many-with-paperclip-to-upload-multiple-attachments


app/controllers/posts_controller.rb中post_params改成如下代码。

def post_params
       params.require(:post).permit(:title, :body, assets_attributes: [:asset])

end

asset.rb要改为

class Asset < ActiveRecord::Base
      belongs_to :post
      has_attached_file :data, :default_url => "/images/:style/missing.png"
      validates_attachment_content_type :data, :content_type => /\A*\/.*\Z/
  end





0 0