【问题标题】:Call erb within an external class in sinatra在 sinatra 的外部类中调用 erb
【发布时间】:2014-02-10 09:46:57
【问题描述】:

如果我在 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

在运行 Sinatra 并执行 get 请求时,我得到了一个 MyExternalClass 的未定义方法 `erb'。我假设我缺少一些要求,或者我需要将 Sinatra 对象传递给类(但我不知道如何实现)。

我怎样才能实现这样的目标?

【问题讨论】:

    标签: ruby sinatra erb


    【解决方案1】:

    您可以通过为您的方法创建 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
    

    【讨论】:

      【解决方案2】:

      要在其他类中模仿 Sinatra 控制器的渲染行为,您可以像这样创建模块:

      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在内的布局的模板

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2014-04-25
        • 2011-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多