I have lot of helpers in my main Sinatra project_name.rb and I want to remove them to the external file, what is the best practice to do that ?
from ./preject_na
Just as you said it yourself:
Move the helpers
block into another file and require
it where you need.
#helpers.rb
helpers do
...
end
#project_name.rb
require 'path/to/helpers.rb'
It seems the answer @DaveSag offered miss something. Should add a line at the beginning of my_modular_app.rb
:
$:.unshift File.expand_path('../lib', __FILE__) # add ./lib to $LOAD_PATH
require 'sinatra/base'
require 'sinatra/some_helpers' # this line breaks unless line 1 is added.
# more code below...
In addition, if someone prefers a "classical style" like me, the following is for you :)
In app.rb
$:.unshift File.expand_path('../lib', __FILE__)
require 'sinatra'
require 'sinatra/some_helpers'
get '/' do
hello_world
end
In lib/sinatra/some_helpers.rb
module Sinatra
module SomeHelper
def hello_world
"Hello World from Helper!!"
end
end
helpers SomeHelper
end
Alas, if, like me, you are building a modular Sinatra app, it's a little more complex than simply moving the helpers
out into another file.
The only way I got this to work is as follows.
first up in your app (I'll call this my_modular_app.rb
)
require 'sinatra/base'
require 'sinatra/some_helpers'
class MyModularApp < Sinatra::Base
helpers Sinatra::SomeHelpers
...
end
and then create the folder structure ./lib/sinatra/
and create some_helpers.rb
as follows:
require 'sinatra/base'
module Sinatra
module SomeHelpers
def help_me_world
logger.debug "hello from a helper"
end
end
helpers SomeHelpers
end
doing this you can simply split all your helpers up into multiple files, affording more clarity in larger projects.
The simple and recommended way:
module ApplicationHelper
# methods
end
class Main < Sinatra::Base
helpers ApplicationHelper
end
I just added require_relative './lib/sinatra/helpers'
to my config.ru
and that's all.
So it looks like this:
require_relative './config/environment'
require_relative './lib/sinatra/helpers'
use ProjectsController
run ApplicationController
and my ./lib/sinatra/helpers.rb
file is not even a module and I don't use any requires or includes in it. I can just define methods straight in this file and use them all over the app.
The answer of @kgpdeveloper didn't work for me.