2016-11-01 2 views
1

Я создаю то, что можно описать как CMS (по крайней мере, на некоторых частях он работает как CMS).Rails - Хранить шаблоны html в файловой системе или в базе данных

Я читал, что «конечно, вы никогда не должны ставить HTML кода в базе данных», но чтение this и увидеть некоторые на самом деле это сделать (это gem или here), я сомневаюсь, что лучший способ решить мою проблему.

Ниже поясняются мои текущие проблемы с моим текущим решением. Возможно, лучший способ - поместить его в базу данных, возможно, это сохранить файловую систему, но в другом случае, чем то, что я делаю.

Администраторы бэк-офиса (по адресу Active Admin) Я создаю (т. Е. Разработчики, но также и «маркетологи» => не общедоступные/интернет-посетители) могут перейти в Active Admin и создать «Modals».

Например, я могу создать в Active Admin 'create new Modal' такой модальный вид: name => "Mix of 2 text, 1 image, 1 video" и 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 } 

Тогда в активном Admin, администратор может пойти и создать новую «страницу» (есть модель страницы тоже в моей базе данных) : Он может указать, например, название: «пример заголовка» modals: там он выберет в списке выпадающий один из t он модалов. Скажем, теперь он выбирает модальный 37. Active Admin затем спросит его, хорошо, пожалуйста, выберите следующие компоненты для этого модального (что важно: приложение спрашивает его об этом, потому что я хранил в базе данных Modal таблицу, что компоненты для модальных = 37 являются text1, text2, image1 и image2):

  • текст 1 - он может написать, например, 'это интро предложение'
  • текст 2 - он может написать здесь 'текст'
  • изображение 1 - он пишет http://example.com/image1.png
  • изображение 2 - он пишет http://example.com/image2.png

Это создаст в активном администратора идентификатор страницы = 8 (пример) и на странице базы данных имеет столбец атрибутов «Модальные», который будет выглядеть как этот

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} 
] 

Так что, когда интернет-пользователи будут загружать страницы, J = 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 в файловой системе с правильным идентификатором:

_modal37.html.Еврорадио

<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> 

Возвращаясь к моему интернет-пользователя, который загружен Page 8, а затем нажал на кнопку, приложение будет загружать содержимое модального путем загрузки частичной _modal37.html.erb.

Итак, сегодня все хорошо работает :) и хотя есть некоторые риски (а не область вопроса, но если администраторы бэк-офиса (Active Admin) меняют структуру модальности, то мы имеем в файле системы также изменить его, например, они добавляют «image3» ...), но моя основная проблема заключается в следующем:

Это как координировать и поддерживать эту систему, не нарушая развитие среды LOCAL environment/PRODUCTION ,

Действительно, возможно, вы не заметили, но есть большой вопрос. Я знаю, потому что я столкнулся с этим :)

Когда я все это сделал, я был в ЛОКАЛЬНОМ развитии. Это означает, что я создал в своей файловой системе частичный _modal37.html.erb. Но проблема в том, что в производстве, кто знает, может быть, 37-й созданный модаль не будет иметь одинаковую структуру, может быть, это будет (text1, video1) и никакого изображения, поэтому в процессе частичный _modal37.html.erb должен отличаться от тот, который я использовал в локальном режиме.

Так что, если я держать вещи, как сейчас, мне нужно быть очень строгим, почти бог строгого уровня, и я думаю, что это показывает мне, что это решение не является правильным: Я бы нужен каждый раз

  • если я создать в местном «активного администратора» новой модальный (скажем, недавно созданный имеет идентификатор = 37)
  • создать в моей файловой системе частичного _37.html.erb
  • перейти в активный администратор в производстве и создайте SAME modal (для модели Modal), которая также будет, надеюсь, 37, если с начала времени я воспроизвел каждый раз, что я делаю в местной, а также в производстве ...

Если я следовать за этим каждый раз, местные и производство всегда будет синхронизировать»и имеют тот же идентификатор/компоненты, но это ад :)

же, когда я Удаление или Edit делать какие-либо изменения в локальном активном администраторе структура Modal, я должен сделать это в производстве тоже ... это никогда не заканчивается и не реалистично соответствовать :)

Так что должно Я делаю ?

  • положить шаблон html в базу данных, вместо того чтобы иметь его внутри моих партикулов? Как, в таком случае, сообщить Rails для выполнения кода внутри базы данных: «это первый текст <% = модальный ['text1']%> '. как бы база данных «понимала»/была «сознательной», что каждый модальный в <% = модальный ['text1']%> находится внутри цикла ruby, который вы видите в 'page.html.erb' выше? Hard ...

  • сохранить настройку, как сегодня, и поместить html-модальное содержание в частичное: как решить мою очень «логистическую» проблему локального/производственного взаимодействия?

+1

Вы изучали использование шаблона для db-safe, например [Liquid] (https://github.com/Shopify/liquid)? – mysmallidea

+0

да, но, похоже, это было для ситуации, когда вам нужно защитить то, что делают посетители Интернета/создают шаблоны, а не когда я их создаю. – Mathieu

+0

Также я не понял на Liquid, если он хранит html-шаблоны в базе данных или нет. – Mathieu

ответ

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, если бы он знал имя частичных или, возможно, маршрут к частичным.

+0

Позвольте мне подумать, как он может работать в моем приложении – Mathieu

+0

Просто помните, что этот метод _might_ решает вашу проблему, но по сути это жесткое кодирование вашего частичного имени и имена переменных внутри в частичном. Вам нужно будет обновлять свою базу данных каждый раз, когда вы меняете имена переменных и т. Д. – Jeff

+0

Я знаю, я думаю, что попробую Liquid, предложенную @mysmallidea, но ваша тоже хорошая идея. – Mathieu

Смежные вопросы