2014-12-18 4 views
0

Отказ от ответственности: Я разработчик PHP и немного новичок в Rails.Создание блоков контента с различными типами

Я работаю над приложением, которое требует от меня создания блоков контента. Существуют разные типы блоков, но они имеют общие элементы (Title, Location). Проблема, с которой мне сложно переносить мой мозг, заключается в том, что каждый блок может определять свой контент по-другому.

Например:

Content Block (содержание) - Этот блок хранит HTML вошел в пользователем, поэтому он хотел бы получить его данные вытащил из базы данных.

Календарь Блок (календарь) - Этот блок отображает список событий, так что нужно будет его рендеринг

Integration Block (интеграция) - Этот блок является примером третьего блока интеграции стороны. Он может получать свои данные, анализируя json-канал и отображая его определенным образом.

Таким образом, моя мысль заключалась в том, чтобы создать каждый из этих типов блоков как модуль или плагин, который регистрирует тип блока и предоставляет информацию о том, как и где получить эти данные. Подобно тому, как работает система крючков Drupal. Я изо всех сил пытаюсь понять, как это сделать. Теоретически может существовать неограниченное количество типов блоков, и я хочу убедиться, что я смогу сохранить эту базовую базу кода модульной и организованной.

Любое понимание очень ценится.

ответ

0

Вы можете использовать шаблон стратегии:

Предположим, вы получаете некоторые данные из БД, такие как:

block_content_from_db = [ 
    { block_type: "Content", content: "some html", ...any other attributes... }, 
    { block_type: "Calendar", content: "appointment data", ...any other attributes... }, 
    { block_type: "Integration", content: "integration data", ...any other attributes... } 
] 

И реализовать каждый тип блока и суперкласс:

class Block 
    def initialize(block_data) 
    @block_data = block_data 
    @renderer = Blocks.const_get "#{block_data[:block_type]}Block" 
    end 

    def render 
    @renderer.new(@block_data).render 
    end 
end 

module Blocks 
    class ContentBlock < Block 
    def initialize(block_data) 
     @block_data = block_data 
    end 

    def render 
     "Rendered ContentBlock: #{@block_data[:content]}" 
    end 
    end 

    class CalendarBlock < Block 
    def initialize(block_data) 
     @block_data = block_data 
    end 

    def render 
     "Rendered CalendarBlock: #{@block_data[:content]}" 
    end 
    end 

    ... and so on ... 
end 

Затем произвести визуализацию всех block_content_from_db:

block_content_from_db.each do |block_data| 
    Block.new(block_data).render 
end 

# => "Rendered ContentBlock: some html" 
# => "Rendered CalendarBlock: appointment data" 

Теперь, когда вы хотите добавить новый тип блока только подкласс из блока снова и определить метод render, который принимает content из db для использования в рендеринге. content может быть любым, что нужно блоку.

Вам необязательно, чтобы подкласс от Блока также не нужен, просто если вы хотите поделиться общими методами между подклассами.

Поставив подклассы в Blocks модуле мы просто их так разделяет пространства имен мы можем позже сделать Blocks.constants и получить список всех реализованных блоков рендереров и, скажем, использовать это в раскрывающемся меню в пользовательском интерфейсе для создания нового block_content_from_db s.

+0

Спасибо за помощь. Это заставляет меня двигаться по правильному пути. Я ценю это! –

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