[rails] paperclip works on windows
- September 6th, 2010
- Posted in rails
- Write comment
需要实现一个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
看不懂啊。你也开始写技术文啦。对了,你是用什么做版本控制的啊
我乱写一下 做个笔记 也分析一下解决问题的过程 我现在用的git
你好,我在学习你这篇文章的时候在第六关于ImageMagick的时候出现了如下问题,当我执行create提交表单后出现如下错误:undefined method `exitstatus’ for nil:NilClass
当我把model里面的styles去掉后,错误消失可以正常运行。
按照你说的我copy了这段:identify -format %wx%h “C:/Documents and Settings/Administrator/stream20110829-568-14mol6f-0.jpg[0]“在命令行可以正常执行。
但加上style后仍然不能正常运行,如你所说我建立了paperclip_patch.rb然后copy你相应的代码,仍不能正常执行。
这是因为什么原因呢?