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

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

我正在构建一个可以称之为CMS的组件(至少在某些部分上它是作为CMS运行的)。
我读到“当然你不应该把html代码放进数据库”,但是读到了this并且看到一些人真的这么做了(这是gem或者here),我怀疑解决我问题的最好方法。
下面解释了我当前的问题和我当前的解决方案。也许最好的方法是把它放在数据库中,也许是放在文件系统中,但用的方式要比我做的方式多。
我构建的后台(onActive Admin)的管理员(即:开发人员,但也包括“营销人员”=>而不是普通公众/互联网访问者)可以转到活动管理员并创建“modals”。
例如,我可以在活动管理员的“create new model”中创建如下模式:name=>“mix of 2 texts,1 image,1 video”和components=>{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 }

然后在active admin中,管理员可以去创建一个新的“页面”(我的数据库中也有一个页面模型):
他能以身作则
标题:“标题示例”
情态动词:他将在一个选择下拉菜单中选择其中一个情态动词。假设现在他选择了模态37。
活动管理员将询问他,确定,然后请为此模式选择以下组件(重要:应用程序询问他,因为我存储在数据库模式表中,model=37的组件是text1、text2、image1和image2):
文本1-他可以写例如“这是介绍句”
文本2-他可以在这里写“一些文本”
图1-他写http://example.com/image1.png
图2-他写http://example.com/image2.png
这将在active admin中创建一个页面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}
 ]

所以当互联网用户将加载页面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 %>

如您所见,现在用户单击了按钮,应用程序将查看列“modal”,并检查数组中的第一个id=37。因此,作为开发人员,当在后台创建新模板(active admin)时,我们必须在文件系统中使用正确的ID创建新的partial\u modal37.html.erb:
_ 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页并单击按钮的Internet用户,应用程序将通过加载partial _modal37.html.erb加载模态内容。
所以今天一切都很好:)尽管存在一些风险(不是问题的范围,但是如果后台的管理员(活动管理员)更改了模式的结构,那么我们在文件系统中也要更改它,例如他们添加了一个“image3”…),但我的主要问题是:
如何在不破坏当地环境/生产环境发展的前提下协调和保持这一体系。
的确,也许你没有注意到,但有一个大问题。我知道因为我面对它:)
当我做以上这些的时候,我在当地发展。这意味着我在文件系统中创建了一个partial-modal37.html.erb。但问题是,在生产中,谁知道,也许第37个创建的模式将不会有相同的结构,也许它将(text1,video1)和没有图像,所以在生产中,partial-modal37.html.erb必须不同于我在本地模式下使用的模式。
所以如果我像现在这样,我需要非常严格,几乎是上帝严格的标准,我认为这说明这个解决方案是不对的:我每次都需要
如果我在本地“active admin”中创建了一个新模式(假设新创建的ID=37)
在我的文件系统中创建partial_37.html.erb
进入生产中的活动管理并创建相同的模式(对于模式模型),如果从一开始我就复制了我在本地和生产中所做的每一次,那么也希望是37…
如果我每次都这么做,本地和生产将始终保持同步,并具有相同的ID/组件,但这是地狱:)
同样,当我删除或编辑在本地活动管理模式的结构中进行任何更改时,我也必须在生产中进行此操作…这永远不会结束,而且不符合以下要求:)
那我该怎么办?
把html模板放到数据库中,而不是放在我的部分中?在这种情况下,如何告诉rails在数据库中执行代码:“这是第一个文本<%=modal['text1']%>”。数据库如何“理解”/“意识到”<%=modal['text1']%>中的每个模式都在上面的'page.html.erb'中可以看到的ruby循环中很难…
保持今天的设置,并将html模式内容放在部分:如何解决我的“物流”本地/生产协调问题?

最佳答案

有一个模态对象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。

关于ruby-on-rails - Rails-将html模板存储在文件系统或数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40367118/

相关文章:

ruby-on-rails-4 - 轨道 4 : where to place Struct?

ruby-on-rails - 如何在 Rails 文档中发现可用的方法?

ruby - 无法使用 ruby​​ aws-sdk v2 在 S3 中创建存储桶

ruby-on-rails - 如何获得一组单选按钮来接受 NULL(未选中)?

ruby - 通过 RVM `C compiler cannot create executables` 安装 Ruby 时运行配置时出错

compass-sass - compass-rails 是否支持 Ruby on Rails 4.0?

ruby-on-rails - 获取多态关联的有效模型列表

ruby-on-rails - 建立连接似乎不支持连接

ruby-on-rails - Ruby 1.9、Rails 2.3.9 以及数据库和 erb View 中的 unicode 字符,仍然不行吗?

ruby-on-rails - 如何覆盖 Rails 命名约定?