我正在合作一个应用程序,偶尔会遇到麻烦,原因是最初的开发人员在linux上工作而我在OSX中。我目前的问题与使用ImageMagik和paperclip上传图像有关。当我尝试将图片上传到应用时,我收到以下消息。
Permission denied - /assets
我很确定这意味着该应用程序想要将图像保存在资源目录中的某个位置但不能,因为它在我的计算机上不存在。
在模型中,这是解决图片的代码。
has_attached_file :avatar,
:url => "/avatars/:id?style=:style",
:styles => { :large => "190x190#", :medium => "70x70#", :thumb => "106x106#" },
:path => "/assets/rob/images/Users/:id/:style/:basename.:extension"
现在,我假设这个目录存在于原始程序员的计算机上以及托管站点的任何位置。但是我没有那个目录,所以我这样做了:
:path => "~/robotimus/dev_images/:id/:style/:basename.:extension"
但是现在我处于泡沫状态,因为在部署之前我最终还是必须恢复该线路。作为解决方案,我可以编写一个这样的方法。
def images_path
Rails.env.production? ? "/assets/rob/images/Users/" : "~/robotimus/dev_images"
end
然后:路径线看起来像这样:
:path => images_path + "/:id/:style/:basename.:extension"
这听起来像个好主意吗?此外,该方法应存储在何处?我的猜测是它属于config / environment.rb,但我想得到专家的意见。
答案 0 :(得分:10)
我在一段时间内为一个项目做了类似的事情,在开发中我将图像存储在本地,但在生产环境中,它们存储在Amazon S3上。
我做的是我创建了config/paperclip.yml
。
# config/paperclip.yml
common: &common
:styles:
:thumb: "50x50#"
:small: "80x80#"
:medium: "200x150#"
:normal: "320x240#"
:large: "800x600#"
:default_url: "/images/default_image.png"
development:
<<: *common
production:
<<: *common
:storage: :s3
:bucket: "your-bucket-name"
:path: "/:some/:path/:id"
:url: "s3_domain_url
test:
<<: *common
然后我将该文件加载到我的app配置中:
# config/initializers/config.rb
require 'ostruct'
def load_config_yaml(config_file)
YAML.load(File.read(Rails.root.join('config', config_file)))[Rails.env]
end
AppConfig = OpenStruct.new(load_config_yaml('application.yml'))
AppConfig.paperclip = load_config_yaml('paperclip.yml')
然后我刚刚用has_attached_file
提供了AppConfig.paperclip
来电。
# app/models/image.rb
class Image < ActiveRecord::Base
has_attached_file :photo, AppConfig.paperclip
end
因此,如果您想将文件存储在不同的路径中(但仍然在本地),请不要使用s3-stuff。
你当然可以跳过大部分的配置内容,只是在配置中设置图像路径,如果你不想全押这个想法,但我喜欢将配置分开。