Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails—将html模板存储在文件系统或数据库中_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

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

Ruby on rails Rails—将html模板存储在文件系统或数据库中,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我正在构建一个可以被称为CMS的东西(至少在某些部分它是作为CMS运行的) 我读到“当然,你不应该把html代码放在数据库中”,但读到并看到一些人真的这么做了(这一点,或者),我怀疑解决我的问题的最佳方法 下面解释了我当前的问题和我当前的解决方案。也许最好的方法是把它放在数据库中,也许是把它保存在文件系统中,但另一种方式是我所做的 我构建的后台办公室(on)的管理员(即:开发人员,但也包括“营销人员”=>而不是普通公众/互联网访问者)可以转到Active Admin并创建“Modals” 例如,

我正在构建一个可以被称为CMS的东西(至少在某些部分它是作为CMS运行的)

我读到“当然,你不应该把html代码放在数据库中”,但读到并看到一些人真的这么做了(这一点,或者),我怀疑解决我的问题的最佳方法

下面解释了我当前的问题和我当前的解决方案。也许最好的方法是把它放在数据库中,也许是把它保存在文件系统中,但另一种方式是我所做的

我构建的后台办公室(on)的管理员(即:开发人员,但也包括“营销人员”=>而不是普通公众/互联网访问者)可以转到Active Admin并创建“Modals”

例如,我可以在活动管理员的“创建新模式”中创建如下模式:name=>“2个文本、1个图像、1个视频的混合”和components=>{text1、text2、image1、video 1}

这将在我的表“模态”中创建一个新模态

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。 活动管理员将询问他,确定,然后请为此模式选择以下组件(重要:应用程序询问他这一点,因为我在数据库模式表中存储了模式=37的组件为text1、text2、image1和image2):

  • 课文1-他可以写“这是介绍句”
  • 文本2-他可以在这里写“一些文本”
  • 图1——他写道
  • 图2——他写道
这将在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 %>
<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> 

函数loadModalContent(){
var-msg;
msg=Messenger().post({
消息:“”
});
}  
如您所见,现在用户单击了按钮,应用程序将查看“modal”列,并将检查数组中的第一个id=37。因此,作为开发人员,在后台创建新模板(活动管理员)时,我们必须在文件系统中使用正确的id创建一个新的partial\u modal37.html.erb

\u modal37.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 %>
<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页,然后单击了按钮,应用程序将通过加载partial _modal37.html.erb加载模态的内容

因此,今天一切都运行良好:)尽管存在一些风险(不是问题的范围,但如果后台管理员(主动管理员)更改模式的结构,那么我们在文件系统中也要更改它,例如,他们添加了“image3”…),但我的主要问题如下:

这是如何在不破坏本地环境/生产环境发展的情况下协调和保持该系统。

事实上,也许你没有注意到,但有一个大问题。我知道,因为我直面了:)

当我完成以上所有工作时,我是在当地发展部门。这意味着我在文件系统中创建了一个部分_modal37.html.erb。但问题是,在生产中,谁知道呢,可能第37个创建的模式不会有相同的结构,可能会是(text1,video1)并且没有图像,因此在生产中,partial_modal37.html.erb必须与我在本地模式中使用的不同

所以,如果我保持现在这样,我需要非常严格,几乎是上帝严格的级别,我认为这表明这个解决方案是不正确的:我每次都需要

  • 如果我在本地“活动管理”中创建一个新模式(假设新创建的id=37)
  • 在我的文件系统中创建部分_37.html.erb
  • 进入生产中的活动管理并创建相同的模式(对于模式模型),如果从一开始我就复制了我在本地和生产中所做的每一次,这也将是37
如果我每次都这样做,本地和生产将始终是同步的,并且具有相同的id/组件,但这是地狱:)

同样,当我删除或编辑一个模态的本地活动管理结构时,我也必须在生产中进行更改…这是永无止境的,不现实的:)

那我该怎么办

  • 将html模板放在数据库中,而不是放在我的分区中?在这种情况下,如何告诉Rails在数据库中执行代码:“这是第一个文本”。数据库如何“理解”/“意识到”上面“page.html.erb”中的每个模式都在ruby循环中?硬的

  • 保持像今天这样的设置,并将html模式内容放在部分:如何解决我非常“物流”的本地/生产协调问题


你有一个模态对象,它有一个:模板,怎么样?本例中的模板是一个链接列表,其中包含了您希望与其参数一起使用的部分

例如:

 Modal.first.template
 # => {1: [
 #         [partial1, {user: 12, pet: 'dog'}], 
 #         [partial3, {title: "Hello world}]
 #        ], 
 #     2: [
 #         [partial7, {text: 'This is the intro sentence}]
 #        ], 
 #     ...
 #     }
所以现在,只要你的选项和变量匹配,并且部分的名称不变,你就可以去了。维护似乎很高,但我不认为本地/生产服务器会以这种方式不同步


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

您是否考虑过使用db-safe模板引擎,如?是的,但似乎是针对需要保护internet访问者所做的事/创建模板的情况,否