Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sinatra method `development?` undefined

Tags:

ruby

sinatra

The Sinatra docs say that development? will return true when the environment is development, but I receive an error stating that the method development? is undefined.

I tried skipping the shorthand and testing the ENV['RAKE_ENV'] variable itself, but it was just nil.

This is the error I'm getting:

undefined method `development?' for main:Object (NoMethodError)

and this is the code that is triggering the error:

require 'dm-sqlite-adapter' if development?

I am using the modular style app. The line above is an separate file that only manages the model. What's going on?

like image 610
Emanuele Feliziani Avatar asked Jan 16 '15 19:01

Emanuele Feliziani


2 Answers

I struggled with this one, too. Here's what I discovered along the way.

You need to be "inside" a class that inherits from Sinatra::Base (such as Sinatra::Application, which inherits from Base) to be able to use the development? method, which is defined in base.rb.

In a classic Sinatra app you are already coding "inside" a class that inherits from Sinatra::Base. So development? will just work "anywhere".

In modular Sinatra the development? will only work in Sinatra::Base sub-classes, such as:

require 'sinatra/base'

# Placing
# require 'dm-sqlite-adapter' if development?
# here will not work.

class ApplicationController < Sinatra::Base
require 'dm-sqlite-adapter' if development? # But here it works
...
end

# Placing 
# require 'dm-sqlite-adapter' if development?` 
# AFTER the above class will still not work

class SomethingElse 
# nor will `development?` work here, since it is called inside
# a class without Sinatra::Base inheritance
...
end

So basically you can use an ApplicationController class that inherits from Sinatra::Base and inside here check for development?. The same goes for sub-classes that inherits from your ApplicationController class:

class UserController < ApplicationController
  require 'dotenv' if development?
  ...
end

For modular Sinatra, in the (main:Object) code text "outside" Sinatra::Base sub-classes, you need to follow Arup's instructions:

if Sinatra::Base.environment == :development
    require 'awesome_print'
    require 'dotenv'
    Dotenv.load
    ...
end
like image 179
Frank Avatar answered Nov 18 '22 00:11

Frank


Since you are using the modular style, you need to add the module namespace Sinatra::Base before the method.

So you will be able to access Sinatra::Base.development? anywhere in the app.

like image 6
Lucas D'Avila Avatar answered Nov 18 '22 00:11

Lucas D'Avila