如何配置Paperclip以根据环境保存到不同的目录

4

我正在协作开发一个应用程序,有时遇到问题是因为原始开发者使用的是Linux系统,而我使用的是OSX系统。我的当前问题与使用ImageMagik和paperclip上传图像有关。当我尝试将图片上传到应用程序时,我会收到以下消息。

Permission denied - /assets

我非常确定这意味着该应用程序希望将图像保存在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这一行将会变成这样:
  :path => images_path + "/:id/:style/:basename.:extension"

听起来是个好主意吗?此外,这个方法应该被存储在哪里呢?我猜它属于config/environment.rb,但我想听听专家的意见。

1个回答

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

然后我将那个文件加载到我的应用配置中:

# 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相关的内容。

当然,如果你不想完全采用这个想法,可以跳过大部分配置的设置,只需在某个配置文件中设置图像路径即可,但我喜欢将配置文件分开。


我喜欢那种方法。谢谢! - Ben Downey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接