Rails/JavaScript在呈现视图之前交换CSS类

Rails/JavaScript在呈现视图之前交换CSS类,javascript,css,ruby-on-rails,ruby,twitter-bootstrap,Javascript,Css,Ruby On Rails,Ruby,Twitter Bootstrap,目前,我正在从事一个Rails项目,其中我使用了一个引导主题(CSS文件、JavaScript文件等),我将其作为一个Gem包含在Rails项目中 视图中的标记依赖于此引导主题。 我们在这个项目中包含了其他Rails引擎,它也依赖于这个Gem的视图标记 我们想做的是开发一个“模板”系统。 假设我们有一个定义的框,它有一个标题和一个正文。然后,如果包含引导主题,它会附加适当的引导标记。如果使用另一个主题,将为此主题附加适当的标记 现在,如果我们希望将来用Zurb Foundation模板等交换引导

目前,我正在从事一个Rails项目,其中我使用了一个引导主题(CSS文件、JavaScript文件等),我将其作为一个Gem包含在Rails项目中

视图中的标记依赖于此引导主题。 我们在这个项目中包含了其他Rails引擎,它也依赖于这个Gem的视图标记

我们想做的是开发一个“模板”系统。 假设我们有一个定义的框,它有一个标题和一个正文。然后,如果包含引导主题,它会附加适当的引导标记。如果使用另一个主题,将为此主题附加适当的标记

现在,如果我们希望将来用Zurb Foundation模板等交换引导模板。然后我们就迷失了方向,因为我们必须重构每个视图,并用Zurb替换类似引导的标记

第一个想法是用JavaScript开发这个模板,它将改变documentready上的CSS类,但是它不能处理大型DOM树

是否有任何宝石可用于此目的?如何在Ruby/Rails中实现这样一个系统


提前谢谢

我怀疑你是否能找到一个可以提供这种开箱即用功能的宝石。基本上,要实现这一点,您需要使用DSL编写所有视图,该DSL可以转换为Bootstrap、Zurb或其他框架

该DSL可以作为一个应用程序中的一系列辅助方法来实现

例如,您的视图可能如下所示:(假设您使用ERB作为模板引擎)

config/initializers/framework.rb文件中,您可以如下配置引擎:

EngineName.config.framework = :bootstrap # or :zurb
这种方法有一些优点和缺点

赞成的意见
  • 理论上,您可以切换模板框架,而无需实际更改视图
欺骗
  • 为了抽象出特定于框架的类名等,您必须维护一个单独的模板DSL。这可能非常耗时,尤其是当框架需要非常不同的标记来实现相同的结果时。如果您没有预见到未来的标记,那么最终还是需要更改视图以支持它

我个人认为,你应该只考虑一个框架,不要担心这个问题。您的模板DSL不太可能是未来的证明,因此创建一个模板DSL可能是不必要的工作。

感谢您提供了这个非常广泛的答案!真的很感激!
def box(options = {})
  case EngineName.config.framework.to_sym
  when :bootstrap
    klass = '..' # the class you want
  when :zurb
    klass = '...' # the class you want
  end

  content_tag(:section, class: klass) { yield }
end
EngineName.config.framework = :bootstrap # or :zurb