2010-01-16 5 views
1

나는 더 튼튼한 컨트롤러, 더 넓어진 모델 사고 방식을 다하고 있습니다. 당신이 (당신이 나 같은 가정 모델로 이동해야합니다 것을 확인하고 당신이 게을러 및 컨트롤러 때문에 당신을 리팩토링 할 필요가 어떻게레일 : 못생긴 컨트롤러를 청소

  1. :

    나는 대해 이동하는 방법을 알고 싶어

  2. 컨트롤러에 새 요소를 작성하고 구조화하는 방법. 다음 예제를 참조하십시오. 예

은 내가 polymophic "투표"에 대한 상대적으로 지저분한 컨트롤러를했다. ,

def up 
vote = Vote.new 
vote.vote = true 
vote.voter = current_user  
vote.voteable = Recipe.find params[:id] 
vote.save 
end 

나에게 그냥 조금 추한, 나는 아마 대신 새의 create를 사용한다 : 나는 꽤 잘 정리했습니다,하지만 난 좀 더 나은이 작업을 향상시킬 수 있는지 알고 싶어 하지만 비표준 동작 (REST 관련)을 사용하여 여기에 치명적인 경로를 몰고 갈지 궁금합니다.

지금은 new으로 전환 중입니다.하지만 커뮤니티에 대한 관점을 분명히 알고 싶었습니다. 당신이 뭔가를 할 것이다, 그래서 나는 사용자 모델에 투표를 이동 고려해 볼 수 있습니다 귀하의 경우에는

before_filter :load_recipe, :only => %w(show edit update destroy up down) 

private 
def load_recipe 
    @recipe = Recipe.find(params[:id]) 
end 

: 가끔 객체를로드하는 before_filter를 만들 특히 활동이 많은 편안하고 컨트롤러에서

답변

2

핵심은 테스트 중심 개발입니다. 습관을 들여 놓으면 코드를 어디에 넣어야하는지에 대한 질문이 95 %의 시간 동안 응답됩니다. 이유가 여기 있습니다.

단위 테스트 (Rails의 모델 테스트)는 코드를 테스트하는 가장 쉬운 장소입니다. 모델 메소드는 단위 테스트 된 "블랙 박스"스타일이어야합니다. 즉, 메소드 내부에 무엇이 있는지 신경 쓰지 말고 입력 X 만 출력 Y를 제공해야합니다. 이렇게하면 모델에 더 많은 수의 작은 메소드를 작성할 수 있습니다. 매우 큰 방법. 시험하기가 쉬워 질수록 테스트가 더 쉬워집니다. 간단한 메소드는 다른 코드로 쉽게 덮어 쓰기가 쉽습니다. 이는 Ruby의 큰 장점입니다.

컨트롤러 (기능적) 테스트에서는 내부에서 내부에서 일어나는 일에 대해 자세히 알아볼 것입니다. 이러한 방법은 잘리지 않으며 입/출력 시나리오가 건조하지 않기 때문입니다. 데이터베이스 호출 발생, 세션 변수 설정 등. Shoulda는 많은 것을 자동화하는 훌륭한 테스트 스위트입니다.

마지막으로, 내 조언은 좋아하는 플러그인 중 일부를보고 그들이 어떻게하고 있는지 확인하는 것입니다. 테스트에 더 많은 관심이 있으시면 restful controller tests in Shoulda에 관한 기사를 읽어보십시오.

+0

우수한 조언. –

1

:

def up 
    current_user.vote(@recipe) 
end 

다음 모델 :

class User < ActiveRecord::Base 
    has_many :votes 

    def vote(object) 
    votes.create(:vote => true, :voteable => object) 
    end 
end 

는 수 그것의 장점은 당신이 쉽게 투표의 행위를 독립적으로 테스트 할 수 있고, 투표를 가능하게 할 다른 장소가있는 경우 재사용 할 수 있다는 것입니다 (다른 액션의 암시 적 결과로 투표, API를 통한 투표, 투표 등).

+0

yah, 덕분에 문제는 지금 다형성을 유지해야한다는 것입니다. –

+0

나는 당신이 무엇을 얻고 있는지 잘 모르겠습니다. 내가 작성한 것은 당신과 같은 다형성 (즉, 레시피가 명시 적이기 때문에 완전하지는 않음)입니다. 어떤 식 으로든 완전한 다형성을 배제 할 수는 없습니다 (어떤면에서는 더 나은 방식을 지원합니다). – gtd