1

ここ数日頭を悩ませている複雑な質問があります。次の問題を解決するための最良のコード アーキテクチャ アプローチは何だろうと思っています。

ウィジェットを作成する Web アプリがあります。各ウィジェットは独自のテンプレート (テーマ) を持つことができます - ユーザーが選択できる複数のテンプレートがあります。ユーザーは、色、テキスト、サイズなど、各ウィジェット テンプレートの特定のパラメーターをカスタマイズできます。

各テンプレートには、独自のフィールド (デフォルト設定)、html テンプレート ファイル、およびスタイルシートがあります。

Rails アプリの最適なアプローチは何でしょうか?それにより、透過的で論理的な編成になり、変更や新しいテンプレートの作成が容易になりますか? シンプルでモジュール化したいと思います。

テンプレートを頻繁に変更する予定はないので、ハードコードされていても問題ありません。

私は2つのオプションを考えていました.1.デフォルト設定(シリアル化されたテキスト)でフィールドを定義するモデルテンプレートを作成し、テンプレートとスタイルシートを表示します2.親から派生するテンプレート固有のクラスを指すモデルを作成しますテンプレートファイル..これにより、柔軟性が大幅に向上します

テンプレートは、構成された値が挿入されたスタイルシートとテンプレート ビューを返す必要があります。

誰かが私が使用でき、車輪を再発明して複雑すぎたり役に立たなかったりしないようにするためのいくつかの良い慣行を教えていただければ、本当に感謝しています。フィードバックは大歓迎です。

どうもありがとう!

4

1 に答える 1

2

このようなアーキテクチャは、上で指定したすべての要件を満たしていると思います。

まず、2 つの「コア」モデルとその (非常に基本的な、笑) フィールドがあります。

User

  • :id
  • :name

Widget

  • id
  • name

次に、CSS および HTML コード テンプレートとともにデフォルトの属性値を保存するThemeTemplateモデルを作成します。belongs_to Widget

ThemeTemplate

  • id
  • widget_id
  • name
  • attributes属性のキーと値のペアの単純な JSON ハッシュを格納します。例えば:{width:50, height:100}
  • css_code_template
  • html_code_template

css_code_templateandフィールドにはhtml_code_template、簡単に置換できる属性キー マーカーを含める必要があります。たとえば、{{width}}{{height}}.

ここで、最後のモデルに取り組む前に、Widgetをにバインドする方法が必要です。User

UserWidget

  • id
  • user_id
  • widget_id
  • theme_id、現在選択されているの ID を格納しますTheme(以下を参照)
  • generated_css_code*
  • generated_html_code*

  • generate_css_codeこれら 2 つは、 のおよびgenerate_html_codeメソッドを呼び出し続けたくない場合に備えてオプションですTheme

最後になりましたが、すべてのカスタム属性値を格納するモデルがあります。

Theme

  • id
  • name
  • user_widget_id
  • theme_template_id
  • custom_attributes属性のキーと値のペアの単純な JSON ハッシュを格納します。例えば:{width:55, height:105}

このモデルには、generate_css_codeおよびの メソッドも必要です。これらのメソッドは、およびのgenerate_html_codeからコードを読み取り、属性キー マーカーをカスタム ( から) またはデフォルト ( から) の値に置き換えます。css_code_templatehtml_code_templateThemeTemplateThemeThemeTemplate

カスタム テンプレートの問題は、十分なエラー検出機能を常に備えておきたいということです。

言うまでもなく、上で説明した例は、要件に取り組むための非常に簡単な方法です。拡張機能の 1 つは、属性を格納するために「NoSQL」データベース (MongoDB など) を使用することです。

于 2013-08-28T00:20:46.367 に答える