Ruby Sinatra是否有办法将视图中使用的辅助对象与路由中使用的辅助对象分开?

Ruby Sinatra是否有办法将视图中使用的辅助对象与路由中使用的辅助对象分开?,ruby,sinatra,Ruby,Sinatra,Sinatra的所有助手都可以通过我的HAML代码和我的路线访问。但是我发现我自己正在为这两种语言编写两套完全不同的代码 理想情况下,我想把它们分开。目前我把它们放在两个不同的目录中,但这似乎毫无意义。有人能提出一种方法来限制名称空间冲突造成的潜在损害吗 起初我以为是模块。从Sinatra自述: module FooUtils def foo(name) "#{name}foo" end end module BarUtils def bar(name) "#{name}bar" en

Sinatra的所有助手都可以通过我的HAML代码和我的路线访问。但是我发现我自己正在为这两种语言编写两套完全不同的代码

理想情况下,我想把它们分开。目前我把它们放在两个不同的目录中,但这似乎毫无意义。有人能提出一种方法来限制名称空间冲突造成的潜在损害吗

起初我以为是模块。从Sinatra自述:

module FooUtils
  def foo(name) "#{name}foo" end
end

module BarUtils
  def bar(name) "#{name}bar" end
end

helpers FooUtils, BarUtils
但实际上这样做有什么意义吗?他们不必在我的Sinatra应用程序中共享同一名称空间吗?

一些试探性的、并不完全令人满意的答案: 1以与helpers相同的方式定义但未调用Sinatra::helpers的方法似乎无法从视图中访问,但可以从Sinatra应用程序块中访问。即:

require 'sinatra'

module Sinatra

  module MyThing

    # Helper classes and methods go here

  end

  helpers MyThing  # <- leave this out if you don't want access from views
end
2当然,您也可以使用MyThingHelpers和MyThingLib模块,而不仅仅是神话,以防止名称空间冲突

3,您可以将它们放在单独的子目录中


我还没有确信这些是解决我担忧的一个全面的解决方案。我想,除非有人能在这里给我一个更好的答案,否则时间和测试会证明一切。

你担心的是方法名称冲突吗?@iain。一定程度上但这也是关于责任的基本分离。不同的东西不应该混为一谈;那不是个好设计。恐怕我的问题已经被编辑过了,看起来好像我只是担心名称空间冲突。我想你还需要添加一些它可能会给你带来的问题,因为你可以使用很多策略来区分事物或不区分事物,但很明显,其中一些策略比其他策略更适合不同的情况。@iain:,除了名称空间冲突之外,我没有任何具体的例子。我只是不想把视图中应该访问的代码和不应该访问的代码混为一谈,因为我认为这是一种糟糕的设计。如果我不小心在视图中调用了后者呢?它们都在同一个范围内,因此如果您担心在视图中调用错误的东西,那么我能给出的最好建议是为视图编写一个规范,检查一切看起来都很好。或者像我们希望OpenSSL程序员那样小心:-