Ruby on rails 如何使gem中的函数可供Sinatra视图使用?
问题是如何将Rails视图助手函数提取到gem中,accept的答案非常好 我想知道-如何为西纳特拉做同样的事?我正在制作一个gem,它在一个模块中定义了一组helper函数,我想让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? :
未定义的局部变量或方法
错误
到目前为止,我的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
,以便使用经典风格的人可以使用它。啊,我明白了。谢谢你的澄清。