0

現在、私は Rails プロジェクトに Gem として含まれている Bootstrap-Theme (CSS ファイル、JavaScript ファイルなど) を使用する Rails プロジェクトに取り組んでいます。

ビューのマークアップは、この Bootstrap-Theme に依存しています。このプロジェクトには、この Gem のビューのマークアップに依存する他の Rails-Engine が含まれています。

私たちがやりたいことは、「テンプレート化」システムを開発することです。ヘッダーとボディを持つ定義済みのボックスがあるとします。次に、Bootstrap-Theme が含まれている場合は、適切な Bootstrap マークアップを添付します。別のテーマが使用されている場合は、このテーマに適切なマークアップが添付されます。

現在、将来 Bootstrap-Template を Zurb-Foundation-Template などと交換したい場合。次に、すべてのビューをリファクタリングし、Bootstrap のようなマークアップを Zurb のものに置き換える必要があるため、道に迷ってしまいます。

最初のアイデアは、このテンプレートを 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 を維持する必要があります。特にフレームワークが同じ結果を達成するために非常に異なるマークアップを必要とする場合、これは時間がかかる可能性があります。将来のマークアップを予見していなかった場合は、とにかくそれをサポートするためにビューを変更する必要があります。

個人的には、これを気にせずに、1 つのフレームワークで進めることを検討する必要があると思います。テンプレート DSL が将来にわたって保証される可能性は低いため、DSL の作成は不要な作業になる可能性があります。

于 2013-11-13T19:31:41.147 に答える