Rails应用程序设计 - 如何使其模块化

时间:2013-08-27 21:29:07

标签: ruby-on-rails ruby-on-rails-3

我有一个复杂的问题,我过去几天一直在强调我的头脑。我想知道在解决以下问题时最好的代码架构方法是什么:

我有一个可以创建小部件的网络应用。每个小部件都可以拥有自己的模板(主题) - 用户可以选择多个模板。用户可以为每个小部件模板自定义特定参数,例如颜色,文本,大小等。

每个模板都有自己的字段(默认设置),html模板文件和样式表。

Rails应用程序中最好的方法是什么,以便透明,逻辑组织,易于更改和创建新模板?我想保持简单和模块化。

我们不打算经常更改模板,所以如果它们是硬编码的话也没关系。

我想到了两个选择: 1.创建一个模板模板,它定义具有默认设置(序列化文本),视图模板和样式表的字段 2.创建一个模型,该模型将指向一个模板特定的类,它将从父模板文件派生出来......这将提供更大的灵活性

模板应返回带有插入配置值的样式表和模板视图。

如果有人能指出我可以使用的一些好的做法,而不是重新发明轮子并使其过于复杂或无用,我将非常感激。任何反馈都非常感谢。

非常感谢!

1 个答案:

答案 0 :(得分:2)

我相信像这样的架构可以满足您在上面指定的所有要求。

首先,你有两个“核心”模型及其(非常基本的,哈哈)字段:

User

  • :id
  • :name

Widget

  • id
  • name

接下来,您拥有ThemeTemplate模型,belongs_to Widget并负责存储默认属性值以及CSS和HTML代码模板:

ThemeTemplate

  • id
  • widget_id
  • name
  • attributes,它存储属性键/值对的简单JSON哈希值;例如:{width:50, height:100}
  • css_code_template
  • html_code_template

css_code_templatehtml_code_template字段应包含易于替换的属性键标记。例如,{{width}}{{height}}

现在,在我们处理上一个模型之前,您需要一种方法将Widget绑定到User

UserWidget

  • id
  • user_id
  • widget_id
  • theme_id,其中存储了当前所选Theme的ID(见下文)
  • generated_css_code *
  • generated_html_code *

  • 如果您不想继续调用generate_css_code的{​​{1}}和generate_html_code方法,则这两个是可选的。

最后但并非最不重要的是,我们拥有存储所有自定义属性值的模型。

Theme

  • Theme
  • id
  • name
  • user_widget_id
  • theme_template_id,存储属性键/值对的简单JSON哈希值;例如:custom_attributes

此模型还应包含{width:55, height:105}generate_css_code方法,这些方法应读取generate_html_code的{​​{1}}和css_code_template中的代码并替换属性关键标记及其自定义(来自html_code_template)或默认(来自ThemeTemplate)值。

自定义模板的问题是您总是希望确保有足够的错误检测。

毋庸置疑,我上面描述的例子是解决您的要求的一种非常简单的方法。一个增强功能可能是使用“NoSQL”数据库(例如MongoDB)来存储您的属性。