2014-12-18 6 views
0

면책 조항 : 저는 PHP 개발자이며 Rails를 처음 사용합니다.다른 유형의 콘텐츠 블록 만들기

저는 콘텐츠 블록을 만들어야하는 응용 프로그램을 만들고 있습니다. 블록에는 여러 유형이 있지만 공통 요소 (제목, 위치)를 공유합니다. 두뇌를 감싸는 데 어려움을 겪고있는 이슈는 각 블록이 다른 방식으로 정의 된 내용을 가질 수 있다는 사실입니다. 예를 들어

:

내용 블록 (내용이) -이 데이터는 데이터베이스에서 뽑아 얻을 것이다, 그래서이 블록 저장소는 사용자에 의해 입력 된 HTML.

달력 블록 (달력) -이 블록은 이벤트의 목록을 표시합니다, 그래서이보기

통합 블록 (통합) 렌더링해야합니다 -이 블록 제 3 자 통합 블록의 예입니다. json 피드를 파싱하고 특정 방식으로 렌더링함으로써 데이터를 얻을 수 있습니다.

제 생각에이 블록 유형 각각을 블록 유형을 등록하는 모듈 또는 플러그인으로 만들고 해당 데이터를 얻는 방법 및 위치에 대한 정보를 제공하는 것이 좋습니다. 드루팔 (Drupal의 후크 시스템이 작동하는 것과 유사합니다. 나는 이것을 설계하는 현명한 방법을 찾아 내기 위해 고심하고있다. 이론 상으로는 무제한의 블록 유형이있을 수 있으며이 코드베이스를 모듈화하고 체계화 된 상태로 유지할 수 있는지 확인하고 싶습니다.

어떤 통찰력이라도 대단히 감사합니다.

당신이 DB에서 같은 일부 데이터를 얻을 가정 :

답변

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" 

이제 새로운 블록 유형을 추가하려면 블록에서 다시 하위 클래스로 유형을 지정하고 db에서 렌더링에 사용할 content을 허용하는 render 메소드를 정의하십시오. content은 유형을 차단할 수있는 모든 것일 수 있습니다.

하위 클래스간에 공통 메소드를 공유하려는 경우에만 반드시 블록에서 하위 클래스로 만들 필요는 없습니다. 우리는 단순히 말하자면, 그래서 우리는 나중에 모든 구현 블록 렌더러의 목록을 Blocks.constants을 얻을 수있는을의 네임하고있는 Blocks 모듈의 서브 클래스를 둬서

가 사용하는 UI의 드롭 다운 메뉴에서 새 block_content_from_db을 만들기위한 에스.

+0

도움 주셔서 감사합니다. 이것은 올바른 길로 나를 시작하게합니다. 감사합니다! –

관련 문제