4

私はアプリで共同作業をしていますが、元の開発者がLinuxで作業していて、OSXを使用しているという事実に起因して、問題が発生することがあります。私の現在の問題は、ImageMagikとペーパークリップを使用して画像をアップロードすることと関係があります。アプリに写真をアップロードしようとすると、次のメッセージが表示されます。

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行は次のようになります。

  :path => images_path + "/:id/:style/:basename.:extension"

これは良い考えのように聞こえますか?また、このメソッドはどこに保存する必要がありますか?config / environment.rbに属していると思いますが、専門家の意見を聞きたいと思います。

4

1 に答える 1

10

しばらく前にプロジェクトで同様のことを行いました。開発ではイメージをローカルに保存しましたが、本番環境ではAmazonS3に保存しました。

私がしたことは、私が作成したことでした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-stuffを使用しないでください。

もちろん、ほとんどの構成をスキップして、構成のどこかにイメージパスを設定することもできます。このアイデアに全面的に取り組みたくない場合は、構成を個別に設定するのが好きです。

于 2012-09-10T18:51:34.413 に答える