2014-12-31 4 views
0

레일스를 처음 사용하고 있으며 리팩토링에 도움이 필요한 부분을 작성했습니다. 뷰 내부에 많은 로직이 있어야한다고 생각하지 않기 때문입니까?이 코드 조각을 리 팩토링 - 레일

http://i.imgur.com/06ViCkV.png (코드 블록은 내가 스크린 샷을 생성 imgur에 업로드 바로 그렇게 표시되지 않습니다.)

감사합니다.

편집 :

<% if @match.creator == current_user or @match.opponent == current_user %> 
    <% if Result.where(user_id: current_user.id, match_id: @match.id).exists? %> 
    You've submitted your results. thank you. 
    <% else %> 
    <%= render('results/form') %> 
    <% end %> 
<% else %> 
    you don't have access to this. 
<% end %> 
+4

아마도이 질문은 [codereview Stack exchange] (http://codereview.stackexchange.com)에 더 적합할까요? –

+0

컨텍스트가없는 약간의 하드. 컨트롤러는 어떻게 보이나요? 이게 언제 렌더링 될 예정입니까? – nathanvda

+2

코드 블록을 텍스트로 복사하여 문제 성명에 붙여 넣을 수 있고 원격 이미지 사이트에서 스크린 샷을 사용하는 대신보기 쉽게 만들 수 있다는 것을 알고 계십니까? 합리적인 리팩토링을 결정하기에 충분한 컨텍스트가 없습니다. 처음에 홍당무를 쓸 때 로직이 컨트롤러에있을 수 있고 대부분 렌더링이 가능하지만 컨트롤러 상호 작용이나 다른 관점에서 무엇을하고 있는지 알지 못해 말할 수 없었습니다. – lurker

답변

0

그래, 나는 미리보기를 해결하는 것입니다. 생성자가 특정 사용자인지 확인하기 위해 이전 콜백을 만드는 것을 고려하십시오. 수행 중이면 아무 것도하지 않고 제한된 액세스 페이지로 리디렉션하십시오.

before_filter :authorize_creator, only: [:show] 

def show 
    @result = blah blah 
end 

private 

    def authorize_creator 
     redirect_to blah_path unless [@match.creator, @match.opponent].include?(current_user) 
    end 
+0

감사합니다. 완벽한 답변입니다. @result %>가 뷰에 표시되지 않는 한 <% = render ('results/form')도 추가하여 원하는 방식으로 작동하게했습니다. – razdotnet

0

본능을 신뢰하십시오. 확실히 많은 논리가보기에 있어서는 안됩니다. 또한, 뷰에 임베드 된 데이터베이스에 대한 명시 적 호출이 있어서는 안됩니다. 컨트롤러는 렌더링 또는 리다이렉트에 관심을 가져야하며 매우 간단하게 초기화해야합니다. 좀 더 복잡한 논리는 도우미 또는 데코레이터에 포함될 수 있습니다. (장식은 기본적으로 레일에없는,하지만 드레이퍼의 보석 및 다른 사람을 포함하기 쉽게합니다.)

A '지방 컨트롤러'가 될 수있는 뷰를 정리하는 방법 뭔가 같은 :

def show 
    @match = Match.find(params[:id]) 
    if [@match.creator, @match.opponent].include?(current_user) 
    @results_submitted = Result.where(user_id: current_user.id, match_id: @match.id).exists? 
    else 
    render text: "You don't have access to this", status: 403 and return 
    end 
end 

아이디어는보기를 위해 물건을 미리 계산하고 가능한 경우보기에서 조건문을 제거하는 것입니다. 또한 Pundit 또는 CanCanCan과 같은 보석을 사용하여 일치 항목에 대한 액세스를 제어 할 수 있습니다.

관련 문제