2013-04-05 2 views
1

사용자가 다양한 유형의 포럼을 만들 수있는 작은 포럼 앱을 작성 중입니다. 예를 들어, 공지 사항, 토론 또는 질문 포럼.레일에서 객체 유형에 기반한 템플릿 렌더링

포럼 모델에는 게시물 수가 많고 forum_type 열이 있습니다. @post.forum_type 열을 기반으로 다른 템플릿을 사용하여 posts#show을 렌더링하고 싶습니다.

각 포럼은 유형에 따라 게시물에 별개의 모양을 갖습니다.

내 코드를 if @post.forum_type == 'something' ...와 (과) 함께 쓰지 않고 어떻게 할 수 있습니까?

+0

다른 아이디어 중에서도'render : template => 'forums/forum_type_here''과 같은 것을 사용하지만'render' 문 안에'@ post.forum_type' 변수를 사용한다면 어떨까요? 이것 :'render : template => @ post.forum_type'? * (문자열 인 경우 @@ post.forum_type' 변수에 뭔가를 추가 할 수도 있습니다.) * – summea

+0

좋습니다. 내가 원하는만큼 깨끗하지는 않지만 훌륭한 대안입니다. – dee

답변

1

위임. 게시물 렌더러를 작성하고 포럼 형식 당 하나 개의 콘크리트 렌더러 서브 클래스 구현 : 이것은 쉽게 만 렌더러를 구현하고 renderer_for 방법 논리의 약간을 추가하여 다른 포럼을 피부 수 있다는 것을 의미한다

class Post 
    attr_accessor :forum_type  
end 

class BaseRenderer 
    def renderer_for(post) 
    # create the correct renderer for the post here 
    end 

    def render_post(post) 
    renderer = renderer_for(post) 
    renderer.to_html # return the results 
end 

class ForumAPostRenderer 
    def initialize(post) 
    @post = post 
    end 

    def render 
    # render the post for forum A here\ 
    end 
end 

class ForumBPostRenderer 
    def initialize(post) 
    @post = post 
    end 

    def render 
    #render post for forum B here 
    end 
end 

합니다.

+0

감사합니다! 소리가 느릴 위험이 있습니다. (저는 매우 새로운 것입니다.)이 수업은 어디에서 살고 있습니까? 그리고 호출 코드는 어떻게 생겼을까요? 그것이 컨트롤러 또는 뷰에 있습니까? – dee

+0

그들은 뷰 로직이고 컨트롤러 로직은 아닙니다. 저는 컨트롤러에서 호출 할 것입니다 - 본질적으로 좀 더 관리가 쉬운 방법으로 조건부 프리젠 테이션 로직을 포함하는 약간 더 복잡한 템플릿입니다. – mcfinnigan

+0

미안하지만, 'render' 메서드는 html을 객체에 적절하게 렌더링 할 것입니다. 아니면 템플릿을 호출할까요? – dee

관련 문제