Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使gem中的函数可供Sinatra视图使用?_Ruby On Rails_Ruby_Gem_Sinatra - Fatal编程技术网

Ruby on rails 如何使gem中的函数可供Sinatra视图使用?

Ruby on rails 如何使gem中的函数可供Sinatra视图使用?,ruby-on-rails,ruby,gem,sinatra,Ruby On Rails,Ruby,Gem,Sinatra,问题是如何将Rails视图助手函数提取到gem中,accept的答案非常好 我想知道-如何为西纳特拉做同样的事?我正在制作一个gem,它在一个模块中定义了一组helper函数,我想让Sinatra视图可以使用这些函数。但是无论我尝试什么,我似乎无法访问函数,我只得到一个未定义的局部变量或方法错误 到目前为止,我的gem结构如下所示(省略了gempec之类的其他内容): 在cool_gem.rb中,我有: if defined?(Sinatra) and Sinatra.respond_to? :

问题是如何将Rails视图助手函数提取到gem中,accept的答案非常好

我想知道-如何为西纳特拉做同样的事?我正在制作一个gem,它在一个模块中定义了一组helper函数,我想让Sinatra视图可以使用这些函数。但是无论我尝试什么,我似乎无法访问函数,我只得到一个
未定义的局部变量或方法
错误

到目前为止,我的gem结构如下所示(省略了gempec之类的其他内容):

cool_gem.rb
中,我有:

if defined?(Sinatra) and Sinatra.respond_to? :register
  require 'cool_gem/sinatra'
end
module CoolGem
  module HelperFunctions

    def heading_tag(text)
      "<h1>#{text}</h1>"
    end

    # + many more functions
  end
end
require 'cool_gem/helper_functions'

module CoolGem
  module Sinatra

    module MyHelpers
      include CoolGem::HelperFunctions
    end

    def self.registered(app)
      app.helpers MyHelpers
    end

  end
end
helper\u functions.rb
中,我有:

if defined?(Sinatra) and Sinatra.respond_to? :register
  require 'cool_gem/sinatra'
end
module CoolGem
  module HelperFunctions

    def heading_tag(text)
      "<h1>#{text}</h1>"
    end

    # + many more functions
  end
end
require 'cool_gem/helper_functions'

module CoolGem
  module Sinatra

    module MyHelpers
      include CoolGem::HelperFunctions
    end

    def self.registered(app)
      app.helpers MyHelpers
    end

  end
end
这不管用。我哪里做错了


(如果你想知道,是的,我需要一个单独的文件中的helper函数。我计划使gem也与Rails兼容,因此如果可能的话,我想保持函数的隔离/解耦)。

你主要是错过了对
Sinatra.register
(在
cool\u gem/Sinatra.rb
)的调用:

现在,任何需要
cool\u gem
的经典风格Sinatra应用程序都将提供帮助。如果使用模块化样式,还需要在
Sinatra::Base
子类中调用
register CoolGem::Sinatra

在这种情况下,如果您只是提供一些helper方法,一种更简单的方法可能是只使用
helpers
方法(同样在
cool\u gem/sinatra.rb
中):


现在,这些方法将在经典风格的应用程序中可用,模块化风格的应用程序将需要调用
helpers-CoolGem::HelperFunctions
。这有点简单,但是如果您要向DSL上下文添加方法,则需要如上所述使用
registed

谢谢。但是我发现我不需要
sinatra.rb
中要求'sinatra/base
,也不需要
sinatra.register CoolGem::sinatra
。只需将
register CoolGem::Sinatra
添加到我的应用程序类中,就可以了…@Xåppi'-I0llwlg'I-是的,如果您已经需要Sinatra(例如在主应用程序中),那么您就不需要再这样做了。另外,
Sinatra.register CoolGem::Sinatra
将在经典的Sinatra应用程序中提供扩展。如果您使用的是模块化样式,那么您还需要在应用程序类中使用
register
。如果您正在提供gem,您可能希望包括
Sinatra.register CoolGem::Sinatra
,以便使用经典风格的人可以使用它。啊,我明白了。谢谢你的澄清。