- 浏览: 2564685 次
- 性别:
- 来自: 苏州
-
文章分类
最新评论
-
jsntghf:
peio 写道这个怎么运行?Ruby On Rails的环境搭 ...
多文件上传之uploadify -
peio:
这个怎么运行?
多文件上传之uploadify -
往事如烟1:
我的项目是自己init了一个原始的project,之后将ver ...
React Native热部署之CodePush -
jsntghf:
往事如烟1 写道我按照你的说明进行,发现app退出之后,在进入 ...
React Native热部署之CodePush -
往事如烟1:
我按照你的说明进行,发现app退出之后,在进入不正确,请问是什 ...
React Native热部署之CodePush
paperclip是一个不错的上传控件。尺寸、路径等在model中简单配置即可。
下面看一个简单的配置:
has_attached_file :cover, :styles => { :medium => "130x95>", :small => "70x70>" }, :path => ":rails_root/public/uploads/:class/:attachment/:id/:style/album_cover.:extension", :url => "/uploads/:class/:attachment/:id/:style/album_cover.:extension", :default_url => "/uploads/:class/:attachment/:style/photo_album_thumb.jpg"
类似:class、:attachment、:id、:style,这些都会自动取到相应的值进行填充。
接下来,看一下这些在paperclip中是如何实现的。
def self.interpolations @interpolations ||= { :rails_root => lambda{|attachment,style| RAILS_ROOT }, :rails_env => lambda{|attachment,style| RAILS_ENV }, :class => lambda do |attachment,style| attachment.instance.class.name.underscore.pluralize end, :basename => lambda do |attachment,style| Iconv.iconv("GB2312", "UTF-8", attachment.original_filename.gsub(/#{File.extname(attachment.original_filename)}$/, "")) end, :extension => lambda do |attachment,style| ((style = attachment.styles[style]) && style[:format]) || File.extname(attachment.original_filename).gsub(/^\.+/, "") end, :id => lambda{|attachment,style| attachment.instance.id }, :id_partition => lambda do |attachment, style| ("%09d" % attachment.instance.id).scan(/\d{3}/).join("/") end, :attachment => lambda{|attachment,style| attachment.name.to_s.downcase.pluralize }, :style => lambda{|attachment,style| style || attachment.default_style }, } end
这里面的占位符都是paperclip自带的。
那么,在model中指定路径时,我们想加入一些自定义的占位符,那该怎么办呢?
例如,我们想在路径中加入当天日期。
model中可以这样来配置:
has_attached_file :cover, :styles => { :medium => "130x95>", :small => "70x70>" }, :path => ":rails_root/public/uploads/:class/:today/:attachment/:id/:style/album_cover.:extension", :url => "/uploads/:class/:today/:attachment/:id/:style/album_cover.:extension", :default_url => "/uploads/:class/:attachment/:style/photo_album_thumb.jpg"
在这个路径中,:today占位符paperclip是不会识别的,所以,我们也得加一个关于:today占位符的实现。
最简单的方法是直接改paperclip中interpolations方法的@interpolations变量,在其中加入以下代码:
:today => proc do Time.now.strftime("%Y%m%d") end
最后,重启服务即可。
不过,不建议这么做。
我们可以在控制器中或者其他地方加入以下这段来实现同样的功能:
Paperclip::Attachment.interpolations[:today] = proc do Time.now.strftime("%Y%m%d") end
如果想在路径中加入自定义的其他占位符,原理和这个类似,只需要修改自定义占位符的实现即可。
评论
3 楼
zhanger
2012-12-07
将时间按年,月,日拆分成三级之后,实际取到的变量值变成了一串很长的数字,没想明白其中原因,LZ分析下呗。
具体是在path中用了三个自定义变量:year,month,day
:path => ":rails_root/public/uploads/:class/:year/:month/:day/:attachment/:id/:style/album_cover.:extension",
三个变量的值如下:
Time.now.year.to_i
Time.now.month.to_i
Time.now.day.to_i
实际使用时用的附件的updated_at时间。
具体是在path中用了三个自定义变量:year,month,day
:path => ":rails_root/public/uploads/:class/:year/:month/:day/:attachment/:id/:style/album_cover.:extension",
三个变量的值如下:
Time.now.year.to_i
Time.now.month.to_i
Time.now.day.to_i
实际使用时用的附件的updated_at时间。
2 楼
jsntghf
2010-08-02
jackdong 写道
:today => proc do Time.now.strftime("%Y%m%d") end
已当前时间为占位符是问题滴, 文件保存时是已当前时间保存滴, 如果第二天去读取文件的时候today占位符对应的时间为当前时间, Time.now.strftime("%Y%m%d") 这个时间明显与数据库值不一样,因此就会找不到路径。 还是以updated_at时间为基准好
是的,我这个只是示例,实际做不会用这个时间的,可以用id之类的,参考这个就行了,改个实现而已。
1 楼
jackdong
2010-08-02
:today => proc do Time.now.strftime("%Y%m%d") end
已当前时间为占位符是问题滴, 文件保存时是已当前时间保存滴, 如果第二天去读取文件的时候today占位符对应的时间为当前时间, Time.now.strftime("%Y%m%d") 这个时间明显与数据库值不一样,因此就会找不到路径。 还是以updated_at时间为基准好
发表评论
-
Redmine集成知识库
2013-08-26 22:25 33381、下载redmine的知识库插件:redmine_know ... -
Redmine集成SVN
2013-08-20 20:13 54331、进入redmine目录下的config目录,我的是/Ap ... -
Redmine集成CKEditor
2013-08-15 21:08 4442Redmine的文本格式默认只支持textile,对于普通 ... -
如何使用Assets Pipeline
2011-11-21 16:13 2018Rails 3.1之前,所有资源文件都放在public的子目录 ... -
Rails console显示执行的Sql语句
2011-11-18 08:49 1945调试Active Record时经常会用到rails cons ... -
migrate中使用bigint
2011-11-14 10:40 2077使用mysql时,integer最大是10位。如果想存储更大的 ... -
rails中使用UUID
2011-11-08 08:44 2784可以将uuid的包拷贝到vendor/plugins下,或者在 ... -
Rails里删除Prototype改用JQuery的方法
2011-11-02 10:55 1569首先在Gemfile中添加jquery的gem gem ... -
ActionView::Template::Error (***.css isn’t precompiled)
2011-10-24 11:10 2551升级到Rails 3.1后,当rails s -e produ ... -
Rails Bundle简介
2011-10-21 09:00 1635Rails 3开始使用bundle来管理项目的gem依赖。该命 ... -
非WEB程序中使用Active Record
2011-10-18 16:08 1501一、新建一个Ruby文件 require " ... -
Rails中使用多选框
2011-10-14 10:10 2371<%= select_tag("tag_ids ... -
Could not find a JavaScript runtime
2011-10-13 13:17 1725Rails3.1下报出下面的错误: /gems/exe ... -
通过POP3读取邮件
2011-10-06 01:36 1635require 'net/pop' pop ... -
观察者模式
2011-10-01 16:24 1588require 'observer' class ... -
ruby1.9的中文问题
2011-09-29 08:31 1880STATUS = { "0" =&g ... -
列出所有的控制器以及方法名
2011-09-27 10:43 1645controllers = Dir.new("#{R ... -
abort的使用
2011-09-22 13:30 1580很多人可能会这样用: def stop_error(m ... -
rails3中mysql2的安装
2011-09-20 16:01 2120rails3中默认的mysql适配器是mysql2,执行以下命 ... -
让查询变得更优雅
2011-09-19 20:19 1144RailsWhere可以让代码变得更简洁。 看一 ...
相关推荐
在Ruby on Rails框架中,Paperclip是一个非常流行的用于处理文件上传的库。它提供了一种简单而优雅的方式来管理和处理模型中的附件,如图片、文档等。Paperclip与ActiveRecord紧密集成,使得在Rails应用中添加文件...
如果您实际上正在使用 ,并且您想要附件具有自定义路径。 请不要使用RAILS_ROOT 。 为什么? 每一个当您将应用程序部署到,您正在更改RAILS_ROOT,因此您所有上传的文件都将丢失,您的存储桶将一团糟! 默认的...
upload_url: "swfuploadfile.js", // 文件上传的后端处理路径 post_params: { "utf8": "✓", "authenticity_token": "<%= form_authenticity_token %>" }, // 上传请求携带的参数 file_size_limit: "100MB", ...
此外,Rails提供了丰富的插件和gem(Ruby gem),例如Devise用于身份验证,CanCanCan处理授权,Paperclip或Carrierwave用于文件上传等,这些都能极大地增强应用的功能。 在开发过程中,Rails还提供了TDD(测试驱动...
最后,Rails社区非常活跃,有许多优秀的第三方gem库可以扩展Rails的功能,例如Devise用于用户认证,CanCanCan处理授权,Paperclip或Carrierwave处理文件上传等。通过`gem 'gem_name'`在`Gemfile`中添加gem,然后运行...
RoR的Gem生态系统非常丰富,如Devise用于用户认证,CanCanCan处理授权,Paperclip或CarrierWave用于文件上传,DelayedJob或Sidekiq实现后台任务队列等。这些Gem极大地扩展了RoR的功能,加速了开发进程。 在"ruby_on...