Rails - 将html模板存储在文件系统或数据库

时间:2016-11-01 19:16:52

标签: ruby-on-rails ruby ruby-on-rails-4

我正在构建可以被描述为CMS的东西(至少在某些部分它作为CMS运行)。

我读到了#34;当然你不应该把html代码放在数据库中#34;但是阅读this并看到一些实际上这样做(gemhere),我怀疑解决问题的最佳方法。

下面解释了我当前解决方案的当前问题。也许最好的方法是将它放在数据库中,也许是保留在文件系统中,但不是我做的。

我建立的后台管理员(Active Admin)(即:开发人员以及#34;营销人员" =>不是普通公众/互联网访问者)可以转到Active Admin创建"模态"。

例如,我可以在Active Admin'创建新模态'像这样的模态:name =>" 2个文本的混合,1个图像,1个视频"和组件=> {text1,text2,image1,video 1}

这将在我的表格中创建' Modals'一个新的模态

id= 37 (it's an example), name: "Mix of 2 texts, 1 image, 1 video", components = components => { text1, text2, image1, video 1 }

然后在主动管理员中,管理员可以创建一个新的“页面”。 (我的数据库中也有一个Page模型): 他可以举个例子 标题:"标题的例子" 模态:在那里他将选择下拉其中一个模态。我们现在说他选择模态37。 然后主动管理员会问他,好吧那么请为这个模态选择以下组件(重要的是:应用程序问他这个因为我存储在数据库模态表中,模态= 37的组件是text1,text2,image1和image2 ):

这将在Active Admin中创建一个Page id = 8(示例),并且在数据库页面中有一个属性列' Modal'看起来像这样

Page.modal(:id =>8) =
 [{"modal_id":"37",
   "text1":"this is the intro sentence","text2":"some text",
   "image1": "http://example.com/image1.png",
   "image2":"http://example.com/image2.png"},
 { here we could have another modal for the same Page}
 ]

因此,当互联网用户加载Page id = 8,并且用户点击特定的按钮时,它将加载模态8。

page.html.erb上的代码

<% @page.modal.each_with_index do |modal, index| %>
  <% index_plus_one = index + 1 %> 

<div>
      <span onclick="loadModalContent<%= modal['modal_id'] %>()"> 
        <i class="fa fa-camera" aria-hidden="true"></i>
      </span>
    </div>
    <script>
      function loadModalContent<%= modal['modal_id'] %>() {
        var msg;
        msg = Messenger().post({
          message:  '<%= j render partial: "pages/modal#{ modal['modal_id'] }",
                    locals: { modal: modal, index: index_plus_one } %>'
        });
      }  
    </script> 
<% end %>

如您所见,现在用户点击了该按钮,该应用将会查看“模式”列中的内容。并将检查数组中第一个是id = 37的那个。作为开发人员,当在后台创建一个新模板(活动管理员)时,我们必须创建一个新的部分_modal37.html.erb in具有正确ID的文件系统

_modal37.html.erb

<div>this is the first text <%= modal['text1'] %></div>
<div>this is the first image : <%= modal['image1'] %></div>
<div>this is the second text <%= modal['image1'] %></div>
<div>this is the second image <%= modal['image 2'] %></div> 

回到加载了第8页然后点击按钮的互联网用户,该应用将通过加载部分_modal37.html.erb加载模态的内容。

所以今天一切运作良好:)尽管存在一些风险(不是问题的范围,但如果后台办公室(Active Admin)的管理员改变模态的结构,那么我们在文件系统中也改变它,例如他们添加了一个&#39; image3&#39; ...),但我的主要问题如下:

如何在不破坏LOCAL环境/ PRODUCTION环境开发的情况下协调和保留此系统。

的确,也许你没有注意到,但是有一个大问题。我知道,因为我面对它:)

当我完成上述所有操作时,我处于LOCAL开发阶段。这意味着我在我的文件系统中创建了一个部分_modal37.html.erb。但问题是,在生产中,谁知道,也许第37个创建的模态将不会具有相同的结构,也许它将是(text1,video1)而没有图像,所以在生产中,部分_modal37.html.erb必须不同于我在本地模式中使用的那个。

所以,如果我保留现状,我需要非常严谨,几乎是上帝严格的水平,我认为这表明我的解决方案不正确:我需要每次

  • 如果我在本地&#39;有效管理员创建&#39;一个新的模态(让我们说新创建的模式有id = 37)
  • 在我的文件系统中创建部分_37.html.erb
  • 进入生产中的活动管理员并创建SAME模式(对于模态模型),如果从一开始我每次复制我在本地,也在生产中的时间,也将有希望37 ... < / LI>

如果我每次都关注这一点,本地和制作将始终同步。并拥有相同的ID /组件,但它是地狱:))

当我执行删除或编辑时,在本地活动管理中对模态的结构进行任何更改,我必须在生产中执行此操作......这永远不会结束并且不符合现实:)

那我该怎么办?

  • 将html模板放在数据库中,而不是将其放在我的部分内容中?在这种情况下,如何告诉Rails执行数据库中的代码:&#39;这是第一个文本&lt;%= modal [&#39; text1&#39;]%&gt;&#39;。数据库如何理解&#34; /是​​&#34;有意识的&#34; &lt;%= modal [&#39; text1&#39;]%&gt;中的每个模态在你可以在&page; .html&#39; page.html.erb&#39;中看到的红宝石循环中。以上 ?硬...

  • 像今天一样保持设置并将html模态内容放在部分内容中:如何解决我的非常&#34;后勤问题&#34;本地/生产协调问题?

1 个答案:

答案 0 :(得分:1)

你有has_one :template的模态对象怎么样?在这种情况下,模板是您想要的部分的链接列表。

示例:

 Modal.first.template
 # => {1: [
 #         [partial1, {user: 12, pet: 'dog'}], 
 #         [partial3, {title: "Hello world}]
 #        ], 
 #     2: [
 #         [partial7, {text: 'This is the intro sentence}]
 #        ], 
 #     ...
 #     }

所以现在,只要您的选项和变量匹配并且部分名称没有变化,您就可以了。维护似乎很高,但我不知道你的本地/生产服务器如何以这种方式不同步。

只要知道部分名称或部分路径,数据库就不需要保存任何HTML。

相关问题