uninitialized constant APN::App::RAILS_ENV #53

azcoov opened this Issue Jul 17, 2012 · 13 comments

5 participants


Hi there, Rails noob here and I'm struggling trying to figure out how to solve this error. It's barking about the RAILS_ENV variable. I've tried a couple of forks that change this to Rails.env but I still get the same error. I don't know enough about rails to dig in any further and I was hoping you could point me in the right direction.

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'
/Library/Ruby/Gems/1.8/gems/rake- `call'
/Library/Ruby/Gems/1.8/gems/rake- `execute'
/Library/Ruby/Gems/1.8/gems/rake- `each'
/Library/Ruby/Gems/1.8/gems/rake- `execute'
/Library/Ruby/Gems/1.8/gems/rake- `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- `invoke_with_call_chain'
/Library/Ruby/Gems/1.8/gems/rake- `invoke'
/Library/Ruby/Gems/1.8/gems/rake- `invoke_task'
/Library/Ruby/Gems/1.8/gems/rake- `top_level'
/Library/Ruby/Gems/1.8/gems/rake- `each'
/Library/Ruby/Gems/1.8/gems/rake- `top_level'
/Library/Ruby/Gems/1.8/gems/rake- `standard_exception_handling'
/Library/Ruby/Gems/1.8/gems/rake- `top_level'
/Library/Ruby/Gems/1.8/gems/rake- `run'
/Library/Ruby/Gems/1.8/gems/rake- `standard_exception_handling'
/Library/Ruby/Gems/1.8/gems/rake- `run'
/usr/bin/rake:19:in `load'
Tasks: TOP => apn:notifications:deliver
Public Radio Exchange member

Yes I'm using bundler.

I've tried running the following:

rake apn:notifications:deliver
bundle exec rake apn:notifications:deliver

Both fail with the same error.


I'm having the exact same issue and getting uninitialized constant APN::App::RAILS_ENV, I just started working on this today. Mine is a Rails 3.2 app, I'm simply adding gem 'apn_on_rails' to my gem file and normal bundle install.

If I do not use an APN::App model and rely on the configatron, I get the following error: No such file or directory - /config/apple_push_notification_development.pem. Configatron config is verbatim from the readme: configatron.apn.cert #=> File.join(RAILS_ROOT, 'config', 'apple_push_notification_development.pem')

I'm having the feeling that maybe I'm not pulling from the correct repository and will investigate that next.


Oh well, I'm able to work around this by hardcoding the full path in app/models/apn/app.rb, line 35 of def self.send_notifications where it is assigning global_cert. I can now continue my testing but will be interested in the real solution so I can unpatch my code.


oh... to help azcoov, in order for my hack to work I first had to put the following line at the top of configatron/development.rb:

RAILS_ROOT, APN::App::RAILS_ENV='development'

I found this in another open issue on this site.


@garyfoster What's that hard-coded path look like for you after the change?

global_cert = File.read(RAILS_ROOT/config/apple_push_notification_development.pem) or is it something different?


global_cert = File.read("/Users/garyfoster/Documents/Projects/ruac/config/apple_push_notification_development.pem")

I've since found that my configatron settings are not being read so it's falling back to the defaults. I'm sure I can figure this out properly but i've got my head in my ios client side code and need to focus on that so I'm only giving it a half-ass effort.


I just ran into this issue too. My Rails knowledge is not very deep, but it seems like the problem is deprecation of RAILS_* environment variables. I user Rails 3.1.0 and I do NOT have RAILS_ROOT/ENV/blah there. Instead, I have Rails.root/env/blah. When I replace RAILS_ENV with Rails.env in app/models/apn/app.rb the first problem goes away. Then I get the second error: "No such file or directory - /config/apple_push_notification_development.pem", which could be because ROOT_ENV is non-existant. (Although I don't have ANY configatron stuff in my config files - not sure whether that's an issue if I store the certs in the DB).

So, the bottom line is, is this gem compatible with Rails 3.1.0??? It seems not. Is there a workaround that wil allow its use in a Production environment? Maybe similar to one of the above suggestions: define somewhere APN::App::RAILS_ENV = Rails.env. But where?


I lost interest in this problem when I realized I do not need this functionality to go live unless I use the supplied rake task. Here is what I did to proceed:

1) add a record to the APN::App model and updating apn_prod_cert and apn_dev_cert with the contents of your cert pem files appropriately
2) use APN::App.send_notifications, this bypasses the seemingly faulty configatron settings to get the certs since they are stored in the database

For #2, I ended up creating my own rake task since I needed it to do some other things as well. The task get's the appropriate APN::App and executes it's send_notifications method. If you have just one app, you could do something like the following:

app = APN::App.first


@garyfoster Thanks for the tips! I actually did get this to work yesterday by doing the same: add the certs to the APN::App table and create my own rake task that uses APN::App.send_notifications directly. :)

HOWEVER, that method still calls APN::App.cert, which does '(RAILS_ENV == 'production' ? apn_prod_cert : apn_dev_cert)'. I had to put 'APN::App::RAILS_ENV = Rails.env' at the top of my config/environment.rb file. Did you have to do anything similar to bypass the deprecated env variable?


ah, yes, I did that same thing as well, had forgotten

 I am beginner ruby on rails and weak english language. I use Rails 3.2.8

Yeah !! I can push notification.

  1. Gemfile >> i use gem 'apn_on_rails' then bundle install this version 'apn_on_rails' >> 0.5.1
  2. In configatron/development.rb >> i add line "RAILS_ROOT,APN::App::RAILS_ENV = Rails.env"
  3. so content in configatron/devlopment.rb below

eg. in file configatron/devlopment.rb

   RAILS_ROOT,APN::App::RAILS_ENV = Rails.env
   configatron.apn.passphrase  = '1150'
   configatron.apn.port  = 2195
   configatron.apn.host  = 'gateway.sandbox.push.apple.com'
   configatron.apn.cert = File.join(RAILS_ROOT, 'config', 'apple_push_notification_development.pem')

   configatron.apn.feedback.passphrase  = '1150'
   configatron.apn.feedback.port  = 2196
   configatron.apn.feedback.host  = 'feedback.sandbox.push.apple.com'
   configatron.apn.feedback.cert = File.join(RAILS_ROOT, 'config', 'apple_push_notification_development.pem')

I run "rails c" for create App, Device and Notification
but I can't use APN::APP.create so I use APN::APP.new instead and I have file "apple_push_notification_development.pem" in config


 app = APN::APP.new   
 app.apn_dev_cert = Rails.root.join('config', 'apple_push_notification_development.pem').read
 app.apn_prod_cert = Rails.root.join('config', 'apple_push_notification_production.pem').read


 device = APN::Device.new  
 device.token = "your device token" >>  "asdfghjk qwsafdewq qqwesaer ......"
 device.app_id = "1"


 notificaiton = APN::Notification.new
 notificaiton.device_id = "1"
 notificaiton.sound = "1.aiff"
 notifcaiton.alert = "I love ruby on rails"
 notifcation.badge = "1"

I create my task in lib/tasks so i create file apn_on_rails.rake


 task :deliver_notifications => [:environment] do

so in rails console >> rake deliver_notifications

It work for me. I can deploy on Heroku

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment