2014-01-21 2 views
3

Каков правильный способ вызова функции erb (который доступен через Sinatra), если у меня есть вспомогательный класс вне основного приложения Sinatra.Вызов erb внутри внешнего класса в sinatra

К примеру, у меня есть в my_app.rb:

require 'sinatra' 
require 'my_external_class.rb' 
get '/' do 
    MyExternalClass.some_function(request) 
end 

Тогда у меня есть файл с именем: my_external_class.rb

class MyExternalClass 
    def self.some_function request 
    erb :some_template 
    end 
end 

При запуске Синатра и выполнения запроса GET, я получаю undefined метод `erb 'для MyExternalClass. Я предполагаю, что мне не хватает ни одного из них, или, может быть, мне нужно передать объект Sinatra в класс (но я не знаю, как это сделать).

Как я мог добиться чего-то подобного?

ответ

3

Вы можете достичь этого путь создания helpers module для ваших методов:

# module instead of a class 
module MyHelpersModule 
    # no need for 'self' 
    def some_function(request) 
    erb :some_template 
    end 
end 

Затем в основном приложении файл вызов helpers MyHelpersModule. Это сделает все методы в MyHelpersModule доступными в вашем приложении, а также, поскольку они выполняются в том же контексте, существующие ваши методы Sinatra (например, erb) будут доступны вашим помощникам.

require 'sinatra' 
require './my_helpers_module' 

helpers MyHelpersModule 

get '/' do 
    some_function(request) 
end 
0

The documentation - это хорошее место, чтобы увидеть способ создания и использования объекта ERB.

0

Для имитации рендеринга поведение контроллера Синатра в каком-то другом классе вы можете создать модуль, как это:

module ErbRender 

    include Sinatra::Templates 
    include Sinatra::Helpers 
    include Sinatra::ContentFor 

    def settings 
    @settings ||= begin 
     settings = Sinatra::Application.settings 
     settings.root = "#{ROOT}/app" 
     settings 
    end 
    end 

    def template_cache 
    @template_cache ||= Tilt::Cache.new 
    end 

end 

Здесь вам может понадобиться настроить settings.root

Пример использования:

class ArticleIndexingPostBody 

    include ErbRender 

    def get_body 
    erb :'amp/articles/show', layout: :'amp/layout' 
    end 

end 

Этот будут правильно отображать шаблоны с макетами, включая content_for

Смежные вопросы