2009-04-15 2 views
5

프레젠테이션 계층에서 코드를 유지하는 것이 가장 좋습니다. 그러나, 나는 얼마를 "받아 들일 수있는"것으로 생각하는지 궁금하다. 예를 들어,이 코드 줄을 사용하여 HTML 선택 상자를 채 웁니다.레일스보기에서 코드가 얼마나 괜찮습니까?

CodesecureProject.find(:all,:order => 'name').collect {|project| [project.name, project.id] } 

바로 지금이 코드 줄이 양식에 포함되어 있습니다. 커뮤니티가 많은 코딩 작업을 수행하고 컨트롤러의 인스턴스 변수에 저장 한 다음 양식에 사용 된 변수를 먼저 저장해야하는지 궁금해합니다.

답변

5

나는 비슷한 달성하기 위해 사이트 모델에서 다음과 같은 정적 인 방법을 사용합니다.

class CodesecureProject 
    def self.select_options 
    CodesecureProject.find(:all, :order => 'name').collect {|p| [p.name, p.id]} 
    end 
end 

을 그리고 그와 뷰를 통해 전화 : 인스턴스에서

, 당신은 시도 할 수

<%= f.select :codesecure_project_id, CodesecureProject.select_options %> 
+1

주 또는 국가와 같이 변경되지 않는 항목의 목록이있는 경우 클래스 상수를 수행 한 다음 Rails 인스턴스 당 한 번만로드 할 수도 있습니다. –

1

발견하지 않으려 고 노력하는 것 외에는 내 프로젝트에 동일한 코드가 많이 있습니다. 귀하의 경우에는 나는라는 이름의 범위

named_scope :order, lambda { |order| {:order => order}} 

을하고 코드를 만들 것입니다 :

CodesecureProject.order(:name).collect {|project| [project.name, project.id] } 

조금 더 깨끗합니다.

이름과 ID가 필요한 선택 상자가 많은 경우 (필자는 때때로 그렇습니다), ModelName을 제외하고 도우미를 만들어 필요한 배열을 반환 할 수도 있습니다.

def magic_for_select(model) 
    model.all.collect{|instance| [instance.name, instance.id]} 
end 
+0

실제로 매우 읽기 자연이 코드를 만들 것 스코프 "ordered_by"를 호출! –

5

나는 결코 그것을하지 않을 것이다 (나는 거짓말을한다). 그러나 주어진 코드 예제는 나를 긴장시킬 것이다. 내 컨트롤러에서 선택 상자에 데이터를 전달하려는 경향이 더 클 것 같습니다. 내가 두 번 이상 뭔가를하고있는 것을 알게되면 도우미 방법이 또 다른 옵션입니다. 각기 다른 견해보다 컨트롤러의 복제가 더 많이 보입니다.

여러 HTML보기에서 동일한 HTML 구성 요소를 사용하는 경우 부분 도용에 도달하거나 custom helper : project_select() 또는 일부에서 전체를 래핑 할 수 있습니다.

MVC 세계에서 더 많이 일할수록 뷰에서 코드를 피할 수 있습니다. 비록 제로 코드 상태에 이르면 일종의 선 (禅) 숙달이 성취 될 것이라는 느낌을 갖지만, 철학적 인 측면을 제외하고 그 가치는 논쟁의 여지가 많습니다.

1

나는 Maran보다 조금 더 나아갈 것이다. 일반적으로 다음을 수행합니다.

  • 모델에서 named_scope를 작성하여 찾기를 실행합니다.
  • 컨트롤러에서 named_scope을 호출하고 결과를 인스턴스 변수에 저장하십시오.
  • 인스턴스 변수 만보기에 놓습니다.

절대적으로 필요한 경우에만 도우미를 사용합니다. 나중에 코드를 다시 살펴볼 때 헬퍼를 호출하는 뷰 (보기에는 또 다른 파일)보다는 뷰가 필요로하는 데이터를 컨트롤러가 설정하는 것을 보게되면 더 쉽게 이해할 수 있습니다.

class Site 
    def self.select_options 
    Site.find(:all, :order => 'UPPER(name)').collect {|s| [s.name, s.id]} 
    end 
def 

그런 다음 내 도메인보기에 내가 전화 : :이 이러한 상황에 대해 정말 잘 작동

<%= f.select :site_id, Site.select_options %> 

관련 문제