0

postgresql を使用して、最初の railsapp を debian サーバーにデプロイしています。

Rails 3.2.9 Ruby 1.9.3-p327 pg 0.14.1

展開後、私が

bundle exec rake db:reset

次のエラーで失敗します:

/var/www/opf/shared/bundle/ruby/1.9.1/gems/activerecord-3.2.9/lib/active_record/connection_adapters/postgresql_adapter.rb:1208: [BUG] Segmentation fault

エラーメッセージの長いリスト。

私のdatabase.ymlは私の開発ワークステーションで正しく動作していますが:

postgresql_adapter がエラーを引き起こしている理由が見つかりません。

- - アップデート

間違ったデータベース名、ユーザー名、およびパスワードを入力しても、結果は同じです。psql my_db my_user で db 接続をテストしたところ、動作しました。私がする場合

bundle exec rake db:reset RAILS_ENV=production

エラーが発生しました:

undefined method `sass' for #<Rails::Application::Configuration:0x00000000dea738>

sasssass-rails、およびhaml -rails gem は /var/www/opf/shared/bundle/ruby/1.9.1/gems に存在しますが

====== 更新 =======

ここに私の database.yml があります:

development:
  host: localhost
  port: 5432
  adapter: postgresql
  encoding: utf8
  database: mydevdb
  pool: 5
  username: myuser
  password: mypass

test:
  host: localhost
  port: 5432
  adapter: postgresql
  encoding: utf8
  database: mytestdb
  pool: 5
  username: myuser
  password: mypass

production:
  host: localhost
  port: 5432
  adapter: postgresql
  encoding: utf8
  database: myproddb
  pool: 5
  username: myuser
  password: mypass

ここに私のGemfileがあります:

source 'https://rubygems.org'

gem 'rails', '~>3.2'
# Ressource : https://github.com/ged/ruby-pg
gem 'pg', '>= 0.14'
# https://github.com/indirect/haml-rails
gem 'haml-rails', '~> 0.3'

group :developpement do
  # Ressource : https://github.com/rspec/rspec-rails
  gem 'rspec-rails', '>= 2.11'
  # Ressource : https://rvm.io//integration/capistrano/
  gem 'capistrano', '>= 2.12'
  # Ressource : https://github.com/btelles/faker
  gem 'faker', '>= 1.0'
  # Ressource : https://rvm.io//integration/capistrano/
  gem 'rvm-capistrano'
end

group :test do 
  gem 'rspec', '>= 2.11'
  gem 'webrat', '>= 0.7'
  gem 'spork-rails', '>= 3.2'
  gem 'factory_girl_rails', '>= 4.0'
end

group :assets do
  # Faciliter la rédaction de feuilles de style CSS
  # Ressource : http://sass-lang.com/
  gem 'sass-rails',   '>= 3.2.3'
  gem 'coffee-rails', '>= 3.2.1'
  # Ressource : http://compass-style.org/
  gem 'compass-rails', '>= 1.0'

  # See https://github.com/sstephenson/execjs
  #readme for more supported runtimesa
  # execjs and therubyracer are ncessary for compass-rails gem to work properly
  gem 'execjs'
  gem 'therubyracer', :platforms => :ruby

  gem 'uglifier', '>= 1.0.3'
end

gem 'jquery-rails'
# Ressource : https://github.com/ctran/annotate_models
gem 'annotate'
# Ressource : https://github.com/asanghi/excel_rails
gem 'excel_rails', '~> 0.3'
# Ressource : https://github.com/voraz/spreadsheet
gem 'spreadsheet', '~> 0.7'
# Ressource : https://github.com/lomba/schema_plus
gem 'schema_plus', '~> 0.4'
# Resource : https://github.com/tchandy/octopus
gem 'ar-octopus', '~> 0.3'
# Resource : https://github.com/ernie/squeel
gem 'squeel', '~> 1.0'
# Resource : https://github.com/plataformatec/devise
gem 'devise', '~> 2.1'
# Resource : https://github.com/martinrehfeld/role_model
gem 'role_model'
# Resource : https://github.com/stffn/declarative_authorization
gem 'declarative_authorization'
# Resource : https://github.com/francesc/rails-translate-routes
gem 'rails-translate-routes', '~> 0.1'

さらにテストを行ったところ、問題は初期化プロセスに起因することがわかりました。ある時点で、アプリの初期化により Ruby インタープリターがクラッシュします。config/application.rb のいくつかの行を削除しました。その結果、少なくともクラッシュが「初期化された定数デバイス」に関するエラーに変わりました。グーグルで調べたところ、application.rbに「require 'devise'」を追加するように追加されていることがわかりました。そうしましたが、エラーと Ruby のクラッシュが再び発生しました。

この問題は、Asset Pipeline と Initialization に関連しているようです。次の行で Ruby インタープリターをクラッシュさせる初期化を行っていることに気付いたので、コメントしました。

Bundler.require(*Rails.groups(:assets => %w(development test)))

私の config/application.rb :

require File.expand_path('../boot', __FILE__)

# Pick the frameworks you want:
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Without this I got a "unitialized Constant Devise" error
require 'devise'

# THIS ALL STUFF MAKES CRASH RAILS INITIALIZATION, so I commented it.
if defined?(Bundler)
  # If you precompile assets before deploying to production, use this line
  #Bundler.require(*Rails.groups(:assets => %w(development test)))
  # If you want your assets lazily compiled in production, use this line
  # Bundler.require(:default, :assets, Rails.env)
end

module Opf
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Custom directories with classes and modules you want to be autoloadable.
    # config.autoload_paths += %W(#{config.root}/extras)

    # Only load the plugins named here, in the order given (default is alphabetical).
    # :all can be used as a placeholder for all plugins not explicitly named.
    # config.plugins = [ :exception_notification, :ssl_requirement, :all ]

    # Activate observers that should always be running.
    # config.active_record.observers = :cacher, :garbage_collector, :forum_observer

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # Pour utiliser la traduction française des messages d'erreur standards
    config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    config.i18n.default_locale = 'fr'

    # Configure the default encoding used in templates for Ruby 1.9.
    config.encoding = "utf-8"

    # Configure sensitive parameters which will be filtered from the log file.
    config.filter_parameters += [:password]

    # Enable escaping HTML in JSON.
    config.active_support.escape_html_entities_in_json = true

    # Use SQL instead of Active Record's schema dumper when creating the database.
    # This is necessary if your schema can't be completely dumped by the schema dumper,
    # like if you have constraints or database-specific column types
    config.active_record.schema_format = :sql

    # Enforce whitelist mode for mass assignment.
    # This will create an empty whitelist of attributes available for mass-assignment for all models
    # in your app. As such, your models will need to explicitly whitelist or blacklist accessible
    # parameters by using an attr_accessible or attr_protected declaration.
    config.active_record.whitelist_attributes = true

    # Enable the asset pipeline
    config.assets.enabled = true

    # Version of your assets, change this if you want to expire all your assets
    config.assets.version = '1.0'

    # =======  DEBUG : without this, Capistrano Assets:precompile crash ========
    config.assets.initialize_on_precompile = false
    # ==============================================================

   # Make crashing Initialization, so I commented
#    config.generators do |g|
#      g.test_framework :rspec
#      g.fixture_replacement :factory_girl
#      g.stylesheets false
      # cette option ne doit pas être activée car elle est géré (et activée) par la gem 'haml-rails'
#      # g.template-engine :haml
#    end

#    config.sass.preferred_syntax = :sass

    # To replace 'div' by 'span' within error-feedbacks
    config.action_view.field_error_proc = Proc.new do |html_tag, instance|
      # Ressources : http://stackoverflow.com/questions/5267998/rails-3-field-with-errors-wrapper-changes-the-page-appearance-how-to-avoid-t
      # Ressources : Railcast : http://railscasts.com/episodes/39-customize-field-error?autoplay=true
      class_attr_index = html_tag.index('class="')
      if class_attr_index
        html_tag.insert class_attr_index+7, 'field_with_errors '
      else
        html_tag.insert html_tag.index('>'), ' class="field_with_errors"'
      end
    end
  end
end

myapp の成功したテストの概要:

  • Postgresql データベース ユーザー アクセスであり、database.yml = WORK と等しい
  • @global gemset 内の宝石の存在 = CHECK
  • サーバー上で「テスト」アプリケーションをゼロから直接作成する = WORK
4

1 に答える 1

0

非常に長い調査とテストの後、問題の原因がわかりました。

いくつかの間違いがありました:

  • execjs gem が適切に機能するためには、

    gem 'therubyracer', :platforms => :ruby

運用グループに属しているか、Gemfile のどのグループにも属していない必要があります

  • ネストされた SASS-CSS アセットのプリコンパイルが機能するように ( rake assets:precompile)、app/assets/stylesheets/application.css.sass の上部にあるマニフェスト (コメント) を削除する必要があります (私は sass-rails および haml-rails gem を使用しています) )、そして次の行を追加する必要がありました:

    @import screen.css.sass

私の app/assets/stylesheets/application.css.sass ファイルに。

  • バンドラーが適切に機能するために、「gem install bundler」中$PATH:に、サーバー側の /etc/profile および /root/.bashrc ファイルに追加するようにというメッセージが表示されました。

  • capistrano deploy:update タスクが適切に機能するためには、忘れずにrequire 'rvm/capistrano'config/deploy.rb ファイルに追加して、capistrano がbundleコマンドを検索 (および実行) できるようにします。

しかし、これらすべての修正を行っても、 postgresql で同じエラーが発生しました。

/var/www/opf/shared/bundle/ruby/1.9.1/gems/activerecord-3.2.9/lib/active_record/connection_adapters/postgresql_adapter.rb:1208: [BUG] Segmentation fault

github に database.yml を保存しないようにするために、この特別なレシピを使用しているためです。そして、カピストラーノが私のレシピファイルを見つけるために、このソリューションを使用します。このレシピの database.yml テンプレートを作成しましたが、どういうわけか、問題はテンプレートに起因していることに気付きました。

Railsの初期化が適切に機能するために、各データベースでこれらの2行を削除する必要がありました。

  host: localhost
  port: 5432

結果の database.yml が破損している可能性があります。これらの (修正) 2 行を再度追加するテストは行っていません。私はすでにこれに数週間を費やしました...

--- 一般的なアドバイス ---

ここで、問題の解決策を見つけようと必死になっている開発者 (私のように) にアドバイスをします。

(このコマンドのデータベース パラメーターのヘルプにrails new newapp --database=postgresql使用) を使用して新しい非常に基本的な Rails アプリをビルドし、.rails new -hrails generate scaffold mymodel mycolumn

アプリケーションディレクトリで、Git を使用しgit initて Capistrano を初期化しcapify . てから、データベース用の gem (たとえば、postgresql 用の pg) を追加し、bundle install を実行します。次に、独自の基本的なdatabase.ymlを使用してデータベースに接続し、テストして、開発ワークステーションで動作することを確認します。コミットして Git リポジトリにプッシュし、capistrano を使用してデプロイし、サーバー側で動作することを確認します。

次に、機能しなくなるまで、(gem、migration、および独自の個人用ライブラリ) を newapp に徐々に追加します。

並行して、newapp から機能するビットをサーバー側の失敗したアプリケーションに追加します (開発ワークステーション側のアプリでは何も変更しないでください)。

これにより、遅かれ早かれ解決策にたどり着きます。

于 2013-03-27T10:44:48.017 に答える