0

目前,我正在开发一个 Rails 项目,在该项目中我使用了 Bootstrap 主题(CSS 文件、JavaScript 文件等),我将其作为 Gem 包含在 rails 项目中。

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

我们要做的是开发一个“模板”系统。假设我们有一个定义好的盒子,它有一个标题和一个正文。然后,如果包含 Bootstrap 主题,它会附加适当的 Bootstrap 标记。如果使用另一个主题,则会为该主题附加适当的标记。

现在,如果我们将来想将 Bootstrap-Template 与例如 Zurb-Foundation-Template 交换。然后我们就迷路了,因为我们必须重构每个视图并用 Zurb 替换 Bootstrap-Like Markup。

第一个想法是在 JavaScript 中开发这个模板,这将改变文档准备好的 CSS 类,但这不能处理大型 DOM 树。

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

提前致谢!

4

1 回答 1

1

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

这个 DSL 可以作为Rails Engine中的一系列辅助方法来实现。

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

<%= box do %>
  <%= header 'Title of the Box' %>
  <%= body do %>
    <p>Box content here</p>
  <% end %>
<% end %>

这些方法的定义可能如下所示:(伪代码)

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

config/initializers/framework.rb文件中,您可以像这样配置引擎:

EngineName.config.framework = :bootstrap # or :zurb

这种方法有一些优点和缺点。

优点

  • 您理论上可以切换模板框架,而无需实际更改您的视图。

缺点

  • 您必须维护一个单独的模板 DSL,以便抽象出特定于框架的类名等。这可能很耗时,尤其是当框架需要非常不同的标记来实现相同的结果时。如果你没有预见到未来的标记,你最终需要改变你的观点来支持它。

就个人而言,我认为您应该考虑只使用一个框架,而不必担心这一点。您的模板 DSL 不太可能是面向未来的,因此创建一个模板可能只是不必要的努力。

于 2013-11-13T19:31:41.147 回答