1

Apache と Phusion Passenger を実行しているステージング/プロダクション マシンに Rails アプリケーションをデプロイしましたが、Paperclip gem を正しくロードできません (または、少なくともそれを使用するアプリケーションの一部を動作させることができません)。他の gem は正常にロードされるようで、RAILS_ROOT/config/environments/staging.rbに設定config.cache_classesすると、残りのアプリケーションは正常に動作します。falsetrue に設定すると、ブラウザー (および apache エラー ログ) に次の Passenger メッセージが表示され、アプリケーションをまったく使用できません。

Error message:
undefined method `validates_attachment_presence' for #<Class:0xb618e938>

Exception class:
NoMethodError

私はかなり長い間グーグルで検索してきましたが、私が抱えているこの問題の解決策を見つけることができません. 明らかなことを見落としていないことを願っています...

UPDATE 21/8: sudo script/server -b 17x.7x.16x.3x -e ステージングでレールアプリを実行している同じボックスで、正常に動作します。これはパーミッションの問題で、Passenger がインストールされた Paperclip Gem を見つけられないのでしょうか?

もっと情報が必要な場合はお知らせください。ありがとうマーク

私の環境に関するいくつかの情報:

$ rails -v
Rails 2.3.5

RAILS_ROOT/config/environment.rb には次のセットがあります。

config.gem "paperclip", :version => "~> 2.3"

Gems 環境:

   $ gem env
    RubyGems Environment:
      - RUBYGEMS VERSION: 1.3.5
      - RUBY VERSION: 1.8.7 (2010-01-10 patchlevel 249) [i486-linux]
      - INSTALLATION DIRECTORY: /var/lib/gems/1.8
      - RUBY EXECUTABLE: /usr/bin/ruby1.8
      - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin
      - RUBYGEMS PLATFORMS:
        - ruby
        - x86-linux
      - GEM PATHS:
         - /var/lib/gems/1.8
         - /home/mark/.gem/ruby/1.8
      - GEM CONFIGURATION:
         - :update_sources => true
         - :verbose => true
         - :benchmark => false
         - :backtrace => false
         - :bulk_threshold => 1000
      - REMOTE SOURCES:
         - http://gems.rubyforge.org/

サーバー上の宝石リスト:

$ gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.9, 2.3.5)
actionpack (3.0.9, 2.3.5)
activemodel (3.0.9)
activerecord (3.0.9, 2.3.5)
activeresource (3.0.9, 2.3.5)
activesupport (3.0.9, 2.3.5)
arel (2.1.3, 2.0.10)
builder (3.0.0, 2.1.2)
capistrano (2.6.0)
cocaine (0.1.0)
daemon_controller (0.2.6)
erubis (2.6.6)
fastthread (1.0.7)
highline (1.6.2)
i18n (0.4.2)
mail (2.2.19)
mime-types (1.16)
mysql (2.8.1)
net-scp (1.0.4)
net-sftp (2.0.5)
net-ssh (2.1.4)
net-ssh-gateway (1.1.0)
paperclip (2.3.12)
passenger (3.0.7)
polyglot (0.3.1)
rack (1.2.3, 1.1.0, 1.0.1)
rack-mount (0.6.14)
rack-test (0.5.7)
rails (2.3.5)
rake (0.9.2, 0.8.7)
treetop (1.4.9)
tzinfo (0.3.29)
will_paginate (2.3.15)

Paperclip gem は次の場所にインストールされます。

$ sudo find / -name 'paperclip'
/var/lib/gems/1.8/doc/paperclip-2.3.12/rdoc/files/lib/paperclip
/var/lib/gems/1.8/doc/paperclip-2.3.12/rdoc/files/lib/generators/paperclip
/var/lib/gems/1.8/gems/paperclip-2.3.12/lib/paperclip
/var/lib/gems/1.8/gems/paperclip-2.3.12/lib/generators/paperclip
/var/lib/gems/1.8/gems/paperclip-2.3.12/generators/paperclip

Apache 仮想ホスト構成:

$ more /etc/apache2/sites-available/staging.mydomain.com 
<VirtualHost *:80>
    ServerName staging.mydomain.com
    DocumentRoot /u/apps/mydomain.com/current/public
    RailsEnv staging 
</VirtualHost>

乗客ページからの追加のスタック トレース (ところで: will_paginate プラグインを削除しようとしましたが、結果はまったく同じです。active_record/base.rb でエラーがスローされます):

Backtrace:
#   File    Line    Location
0   /var/lib/gems/1.8/gems/activerecord-2.3.5/lib/active_record/base.rb 1959    in `method_missing_without_paginate'
1   /u/apps/mydomain.com/releases/20110705192718/vendor/plugins/will_paginate/lib/will_paginate/finder.rb   170 in `method_missing'
2   /u/apps/mydomain.com/releases/20110705192718/app/models/image.rb    5   
3   /usr/lib/ruby/1.8/rubygems/custom_require.rb    31  in `gem_original_require'
4   /usr/lib/ruby/1.8/rubygems/custom_require.rb    31  in `require'
5   /var/lib/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb   158 in `require'
6   /var/lib/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb   265 in `require_or_load'
7   /var/lib/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb   224 in `depend_on'
8   /var/lib/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb   136 in `require_dependency'
9   /var/lib/gems/1.8/gems/rails-2.3.5/lib/initializer.rb   414 in `load_application_classes'
10  /var/lib/gems/1.8/gems/rails-2.3.5/lib/initializer.rb   413 in `each'

画像クラスのコード:

class Image < ActiveRecord::Base

  belongs_to :user

  validate_attachment_presence :photo
  validates_uniqueness_of :photo_file_name, :scope => :user_id

  has_attached_file :photo, :url => "/assets/:user/app/:class/:style_:basename.:
extension", 
    :path => "#{APP_PATH}/:user/app/:class/:style_:basename.:extension",
    :styles => {
      :thumb=> "50x50#",
      :large =>   "400x" }
end

config/environment.rb

# Be sure to restart your server when you modify this file

# Specifies gem version of Rails to use when vendor/rails is not present
RAILS_GEM_VERSION = '2.3.5' unless defined? RAILS_GEM_VERSION

# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')

Rails::Initializer.run do |config|
  config.time_zone = 'UTC'
  config.active_record.observers = :user_observer #, :website_observer
  config.gem "paperclip", :version => "~> 2.3"
end

SITE_NAME = 'Mydomain.com'
CMS_PREFIX = 'joomla'

config/environments.rb/staging.rb

# Settings specified here will take precedence over those in config/environment.rb

# The staging environment is meant for finished, apps and final acceptance testing.
# Code is not reloaded between requests
config.cache_classes = true

# Full error reports are disabled and caching is turned on
config.action_controller.consider_all_requests_local = false
config.action_controller.perform_caching             = true
config.action_view.cache_template_loading            = true


ActionController::Base.asset_host = "staging.mydomain.com"

DOCUMENT_ROOT = "/var/www"
APP_PATH = "/u/apps"
DB_PREFIX = "a001"
DB_USER = "joomla" 
DB_PWD = "*****"
GIT_URL = "git@github.com:****/mydomain.git"

ActionMailer::Base.delivery_method = :smtp

ActionMailer::Base.smtp_settings = {
    :enable_starttls_auto => true,    
    :address => "smtp.gmail.com",
    :port => "587",
    :domain => "gmail.com",
    :authentication => :plain,
    :user_name => "****@gmail.com",
    :password => "****"
  }
4

3 に答える 3

1

ブロックのvalidate_attachment_presence後に行を移動してみてください- Paperclip のインスタンス メソッドが含まれているため、順序に問題がある可能性があります。クラスのロードが開発環境と本番環境で異なることは知っていますが、それらの違いの程度はわかりません。has_attached_filehas_attached_file

于 2011-07-08T02:15:10.820 に答える
1

OK、追加してこれを解決しました

require "paperclip"

image.rb クラスに。

今のところ、この回避策を使用しています。

于 2011-08-21T19:44:27.257 に答える
0

検証方法を間違って入力しました。Paperclip Rdocによると、正しいメソッド名はvalidate_attachment_presence「validates」ではなく「validate」です。

于 2011-07-07T01:31:56.590 に答える