2

rake apn:notifications:deliverインストールしたAPN on Rails gemでコマンドを実行した後、このエラーに悩まされています。

RAILS_ENV 変数について吠えています。RAILS_ENV を Rails.env に変更するフォークをいくつか試しましたが、それでも同じエラーが発生します。どこかに行きたいと思って、そのレポに自分の問題を投稿しました。

レールについてこれ以上掘り下げるには十分な知識がありません。誰かが私を正しい方向に向けてくれることを願っています。そうすれば、a)何がうまくいかなかったのかをよりよく理解し、b)問題を修正できます。

私はバンドラーを使用しており、gem ファイルを git リポジトリに向けています。rake apn:notifications:deliver

air:apnapp azcoov$ rake apn:notifications:deliver --trace
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/version.rb:2: warning: already initialized constant VERSION
    ** Invoke apn:notifications:deliver (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    ** Execute apn:notifications:deliver
    rake aborted!
    uninitialized constant APN::App::RAILS_ENV
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/app/models/apn/app.rb:11:in `cert'
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/app/models/apn/app.rb:22:in `send_notifications'
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/app/models/apn/app.rb:32:in `send_notifications'
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/app/models/apn/app.rb:31:in `each'
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/app/models/apn/app.rb:31:in `send_notifications'
    /Users/azcoov/.bundler/ruby/1.8/apn_on_rails-ca98c7c130f0/lib/apn_on_rails/rails/../tasks/apn.rake:7
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `call'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:205:in `execute'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `each'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:200:in `execute'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:158:in `invoke_with_call_chain'
    /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:151:in `invoke_with_call_chain'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/task.rb:144:in `invoke'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:116:in `invoke_task'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `top_level'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `each'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:94:in `top_level'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:88:in `top_level'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:66:in `run'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:133:in `standard_exception_handling'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/lib/rake/application.rb:63:in `run'
    /Library/Ruby/Gems/1.8/gems/rake-0.9.2.2/bin/rake:33
    /usr/bin/rake:19:in `load'
    /usr/bin/rake:19
    Tasks: TOP => apn:notifications:deliver
4

1 に答える 1

2

Rails のどのバージョンを使用していますか? 私もこの問題に遭遇しました。私の Rails の知識はあまり深くありませんが、問題は RAILS_* 環境変数の非推奨のようです。Rails 3.1.0 を使用していますが、次のものはありません。

RAILS_ROOT/ENV/blah

私の環境では。代わりに、私は持っています:

Rails.root/env/blah

app/models/apn/app.rb で RAILS_ENV を Rails.env に置き換えると、問題はなくなります。

それで、このgemはRails 3.1.0と互換性がありますか??? そうではないようです。本番環境で使用できるようにする回避策はありますか? 多分どこかで定義します:

APN::App::RAILS_ENV = Rails.env

しかしここで?

アップデート:

ここで garyfoster によって説明されている回避策で動作するようになりました: https://github.com/PRX/apn_on_rails/issues/53

要約すると、次の 3 つです。

1) このゲットー ハックを config/environment.rb ファイルに追加します。

APN::App::RAILS_ENV = Rails.env

2) 証明書を APN::App テーブルに挿入します。そのために、1 回限りのレーキ タスクを作成しました。

task :init_apn_certs => [:environment] do # NOTE: One-time task...
  print "Creating APN::App with certs..."
  app = APN::App.create(:apn_dev_cert => Rails.root.join('config', 'apple_push_notification_development.pem').read,
                        :apn_prod_cert => Rails.root.join('config', 'apple_push_notification_production.pem').read)
  puts (app.valid? ? "done" : "failed")
end

3) 別のエラー ('/config/apple_push_notification_development.pem' に関する何かが存在しない) で barfs が発生するため、APN::App.send_notifications メソッドをバイパスする独自の rake タスクを作成します。それのための私のコード:

task :deliver_notifications => [:environment] do
  print "Delivering APNs for app ids..."
  apps = APN::App.all
  apps.each do |app|
    app.send_notifications
    print app.id.to_s + "..."
  end
  puts "done."
end

または、アプリが 1 つしかない場合は、これを行うだけで完了できます。

task :deliver_notifications => [:environment] do
  APN::App.first.send_notifications
end

免責事項: ステージングとプロダクションでこれをまだテストしていません (週末までにテストする予定です) が、動作しない理由はわかりません。

于 2012-07-25T01:20:47.340 に答える