需要实现一个avatar的功能

谷哥说paperclip

先在railscast上看了下Ryan的介绍, 对于功能基本满意。

1. 安装

Rails3用bundle来管理gem的dependencies。

在Gemfile里面加上如下代码

gem 'paperclip' 

然后命令行 bundle check, paperclip需要安装 再bundle install, 再check一下 现在所有的dependencies 都满足了

2. migration

这里假设我是要给user这个model加一个avatar
按照github上讲的http://github.com/thoughtbot/paperclip, 在model里面加上 下面这句

 has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }
rails g paperclip user avatar

这样生成了一个migration file,下面这段是自动生成滴

class AddAttachmentAvatarToUser< ActiveRecord::Migration
  def self.up
    add_column :users, :avatar_file_name, :string
    add_column :users, :avatar_content_type, :string
    add_column :users, :avatar_file_size, :integer
    add_column :users, :avatar_updated_at, :datetime
  end

  def self.down
    remove_column :users, :avatar_file_name
    remove_column :users, :avatar_content_type
    remove_column :users, :avatar_file_size
    remove_column :users, :avatar_updated_at
  end
end

好最后别忘了 rake db:migrate (我经常忘记 囧 ), 这样数据库就搞定啦。

3. controller

Controller 里面不需要做什么改动,因为这里的avatar跟其他的email之类的属性是一样的 所以update的时候都会update的, 就来看看view吧

4. views

首先要有一个form吧, 嗯在我们的form的partial里面加一句, 因为我这里用的是haml所以就没有”"

= form.file_field :avatar

还没有完 还要给form加一个html的option, :multipart => true。这样呢 就给form加了一个enctype=”multipart/form-data“, 完整的haml代码如下

= form_for(@user,:html=>{:multipart=>true}) do |f|
  .field
      =f.label :avatar
      =f.file_field :avatar
  .field
      =f.label :email
      = f.text_field :email
  .field
      =f.label :name
      = f.text_field :name
  .actions
    = f.submit

嗯 form有, 上传完了以后要show出来吧, 然后在show的里面加一句

=image_tag police.avatar.url(:medium)

5.ImageMagick

嗯 运行一下,理论上应该是不行的, 因为这里有个重要的东西我们没有安装。 ImageMagick. 这个才是我们今天讨论的重点, 在linux跟mac下这个不是大问题。但是windows总是让人头痛的。
下载地址:http://www.imagemagick.org/script/binary-releases.php#windows

选好适合自己的下载, 注意安装的时候加入环境变量,为了安全起见可以check一下是否成功加入了

这个时候你运行呢 很可能会得到一个 ”Error: [...] is not recognized by the ‘identify’ command“ 的错误。
为什么环境变量加入了还是不能识别呢, 在cmd里面运行下面的代码
1. 把model里面的styles去掉 测试一下, 如果成功上传 说明确实是paperclip跟ImageMagick之间的沟通出了问题。否则,请检查以上步骤是否正确完成了
2. 测试完以后,加上styles, 为什么要加上? 因为我们需要嘛,如果不需要这个不同大小的话这里就可以算成功了 请忽略后面的。 现在打开你的log,看看有[paperclip]的行是怎么说。copy那句话,我的是如下的

identify '-format' '%wx%h' 'C:/Users/danyi/AppData/Local/Temp/str
eam,4212,0.jpg[0]'  

在cmd中输入,报错
这个时候呢 根据报错发现需要”代替‘.输入下面的命令,再试一下

identify "-format" "%wx%h" "C:/Users/danyi/AppData/Local/Temp/str
eam,4212,0.jpg[0]"

视乎运行成功了, 嗯 问题也似乎找到了。如何解决呢,我在config/initializers里面加入了一个paperclip_patch.rb文件, 然后加入一下代码,overwirte原来的quote_command_options方法。

if RUBY_PLATFORM == 'i386-mingw32'
  module Paperclip
    def self.quote_command_options(*options)
      options.map do |option|
        option.split("\"").map{|m| "\"#{m}\"" }.join("\\\"")
      end
    end
  end
end

再测试。。搞定。。

6 最后

不在于这个问题是怎么解决的,而在于这个过程怎么去发现问题分析问题最后才是解决问题。

明天做image的 crop..

n531