2012-05-29 4 views
3

사용자에게 페이지를 표시하는 "pages_controller"컨트롤러가있는 Ruby on Rails 응용 프로그램을 작성하고 있습니다. 표시 할 수있는 3 가지 다른 유형의 페이지가 있으며 각각의 경우 백엔드에서 다른 일이 발생해야하므로 컨트롤러 내에서 3 가지 방법으로 기능을 나누기로 결정했습니다. 사용자가 페이지를 요청하면 "show"메서드가 호출되어 페이지가 인지 여부 1. 사용자에게 속함 2. 다른 사용자가 소유하고 요청한 사용자가 볼 수 있음 3. 소유 을 다른 사용자에게 보내고 요청한 사용자가 볼 수 없으면 (무단으로)레일즈 컨트롤러에서 뷰를 조건부로 렌더링하는 메서드 호출

적절한 방법을 호출하여 페이지를 표시합니다.

def show 
    if (something) 
     showMine 

    elsif (something else) 
     showAnother 
    else 
     showUnauthorized 
    end 
end 

def showUnauthorized 

    respond_to do |format| 
     format.html # showUnauthorized.html.erb 
    end 
end 

def showMine 

    respond_to do |format| 
     format.html # showMine.html.erb 
    end 
end 

def showAnother 

    respond_to do |format| 
     format.html # showAnother.html.erb 
    end 
end 

내가 레일 "쇼"가 호출 될 때 뷰를 렌더링하고 싶어하기 때문에 오류 누락 템플릿을 얻고 있지만, "쇼"때 내가 어떤 뷰를 렌더링하지 않으 : 코드는 다음과 같이 보입니다 라는. 간단히 "show"가 올바른 메소드를 호출하고, 해당 메소드 (showMine, showAnother 또는 showUnauthorized)의 해당 뷰가 렌더링 되기만하면됩니다. 어떻게해야합니까? 아니면 내가 잘못된 방법으로 전적으로 그렇게할까요?

+0

* showUnauthorized *, * showMine *, * showAnother * 메소드 내부에서'render 'my_custom_view''를 사용해보십시오. 작동하지 않는다면,'show :'에'render : nothing => true'를 지정하십시오. 또한 특별한 방법을 비공개로 선언하는 것이 좋습니다 (문제와 관련 없음). –

답변

2

RESTful 경로에 속하지 않으므로 routes 파일에서 만든 새 액션을 선언해야합니다.
는 나는이 부분 지문 (_showMine.html.erb, showAnother.html.erb, showUnauthorized)

예를 포함하는 방법을 렌더링하여 쇼보기에서 IF를을 컨트롤러 만 show 액션을 유지하고 만들 수 있습니다 sugest :

쇼보기 : 나는 그것이 도움이되기를 바랍니다

if (something) 
    <%= render 'showMine' %> 
elsif (something else) 
    <%= render 'showAnother' %> 
else 
    <%= render 'showUnauthorized' %> 
end 

...

+0

두 가지 대답 모두 훌륭하지만,이 방법을 사용하면 청소기를 이음새로 처리 할 수 ​​있기 때문에 사용할 것으로 생각됩니다. – Andrew

2

나는 기본적으로 새미의 의견에 동의하지만, 여기에 몇 가지 배경이있다 :

레일스에게 어떤 뷰를 사용할 것인지 알려주는 방법은 render입니다. show 메소드에서 해당 메소드에 대한 호출이 없으면 Rails는 사용자가 show.xxx.xxx이라는보기를 가지고 있다고 가정합니다. show.html.erb이 렌더링됩니다. 템플릿 이름 앞에 show 접두사가 붙지 않는다고 가정하지 않습니다. 그것은 show이라고 가정하기 때문에 그 이름은 입니다. 작업의 이름은 요청의 일부로 컨트롤러에 전달됩니다. 단순히 어떤 방법의 이름에서 파생 된 것이 아니라 respond_to 블록이 있습니다. 모든 respond_to 블록이 할

는 요청의 MIME 유형에 따라 서로 다른 뷰 템플릿을 지정,하지만 당신은 render 전화를하지도, 그 여분의 모든 방법은 여전히 ​​(모든 경우에 show.html.erb)를 show보기를 호출하려고 레일스에게 render 다른 뷰를 말한 적이 없으며 작업 이름은 show입니다.

그래서 respond_to 블록 대신 다른 방법으로 render [some_view]을 호출하면됩니다.

는 명확한 답변을하지 않을 수 있습니다, 그러나 나는 또한 읽기 좋을 것 다음

http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

그것은 respond_to 액션 이름 떨어져 그 키가 무엇을보기를 결정하는 방법, 특히, 무엇을하는지 설명 렌더링합니다.

관련 문제