play with paperclip plugin, 为model添加附件

我们首先生成一个新的rails程序
rails bookshop

然后安装scaffolding plugin, (因为这个模块被rails2.0赶出去,变成plugin了)
C:\workspace2\bookshop>ruby script/plugin install scaffolding

然后运行
ruby script/generate scaffold product title:string description:string image_url:string

这样就生成了controller and model and view 而且还有migration。
ok,可以start server了。

下面我们就介绍paperclip:
paperclip 使得为模型添加附件很简单。我们将用这个插件来为product模型添加一个图片作为附件。

首先安装这个plugin:
ruby script/plugin install git://github.com/thoughtbot/paperclip.git

安装完成之后,我们就可以使用这个plugin的generator来为我们product模型添加一个附件字段。

ruby script/generate paperclip product photo

这个generator接收2个参数,第一个是model的名字,第二个是附件字段的名字,同时会生成一个migration,这个migration添加了4个字段到我们模型,分别是:
add_column :products, :photo_file_name, :string
add_column :products, :photo_content_type, :string
add_column :products, :photo_file_size, :integer
add_column :products, :photo_updated_at, :datetime


然后,rake db:migrate, 更新数据库里面的products表

下一步我们应该更新product模型的代码了,我们需要使用 has_attached_file 来告诉他附件那些字段的是与attachment有关的:
class Product < ActiveRecord::Base
  has_attached_field :photo
end



2. 下面该修改view了
创建或者修改product的表格现在需要一个上传附件的功能了
<%for_for @product, :html=> {:multipart => true} do |form| %>
  <ol class="formList">
    <!--Other fields go here...-->
    <li>
      <%= form.label :photo, "Photo" %>
      <%= form.file_field :photo %>
    </li>
    <li>
      <%= form.submit "Submit" %>
    </li>
  </ol>


我们发现第一行的代码有一个我们从来没有见过的东西: :html=>{:multipart => true}
这个参数的作用是使得form_for 可以接受文件附件, 它将给form添加一个属性,
enctype="multipart/form_data"

当然,如果我们上传图片之后不显示出来怎么行呢,所以我们要修改show页面,
<%= image_tag @product.photo.url %>

ok, 现在我们可以看到我们上传的图片了。

但是很快我们图片太大了,所以我们需要服务器端收到图片后,做一下resize的工作(paperclip具有现成的功能)



3. resize 图片
has_attached_file  这个方法可以接受一些选项,其中styles允许我们重新定义图片的size, 要把用户上传的图片变成拇指大小, 我们只需要定义style并指定图片的size。

has_attached_file :photo, :styles => {:small => "150*150>"}
为什么最后会有一个">" 呢?, 这是为了保持图片的长宽比例,防止扭曲。
值得注意的是,要是resize起作用,你必须安装ImageMagick 这个gem

为了看到新的小图片,我们需要为image_tag @product.photo.url(:small)
(因为当用户上传是,服务器会保留原图片,并会生成新的小图片)



4. 设置paperclip的路径:
默认的,paperclip会将附件保存在public/system 目录下,
<img alt="Phone_large" src="system/photos/1/small/phone_large.jpg?1238845888"

paperclip创建他自己的保存附件的结构,生成一个以product id 命名的目录, 然后子目录是我们 在styles参数中定义的名字。 大多数情况下,这种默认的路径是ok的,但是我们也可以改变它。

要改变存储附件的路径,我们只需要给has_attached_file 添加两个参数:
has_attached_file :photo, :styles => {:small => "150x150>"},
  :url => "/system/:attachment/:id/:style/:basename.:extension",
  :path => ":rails_root/public/system/:attachment/:id/:style/:basename.:extension"


上面的代码中的url 和 path 是paperclip的默认值,如果我们想把附件存放在public/asset
那么我们的代码将是:
has_attached_file :photo, :styles => {:small => "150x150>"},
  :url => "/asset/products/:id/:style/:basename.:extension",
  :path => ":rails_root/public/asset/products/:id/:style/::basename.:extension"




5. validating
最后,我们看看paperclip是如何支持上传的文件的validate的,要validate上传的文件,我们可以把validator放在product模型的定义中,
validates_attachment_presence :photo
validates_attachment_size :photo, :less_than => 5.megabytes
validates_attachment_content_type :photo, :content_type=> ['image/jpeg', 'image/png']


要注意的一点是,IE会报告与其他浏览器不同的MIME类型, 例如,他会把jped文件的类型看做 image/pjped 而不是 image/jpeg






你可能感兴趣的:(IE,git,Ruby,Rails,ActiveRecord)