문제

Ruby on Rails 개발(또는 일반적으로 MVC)에서 로직을 어디에 배치해야 하는지에 대해 어떤 빠른 규칙을 따라야 할까요?

그렇다고 대답해주세요 - 함께 이걸 여기에 놔두세요,보다는 거기에 넣지 마세요.

도움이 되었습니까?

해결책

MVC

제어 장치:사용자가 원하는 것을 파악하고, 무엇을 제공할지 결정하고, 로그인 여부, 특정 데이터를 볼 수 있는지 여부 등과 관련된 코드를 여기에 넣으세요.결국 컨트롤러는 요청을 살펴보고 표시할 데이터(모델)와 렌더링할 뷰를 결정합니다.코드가 컨트롤러에 들어가야 하는지 여부가 의심스러우면 넣지 말아야 할 수도 있습니다.컨트롤러를 유지하세요 마른.

보다:뷰에는 데이터(모델)를 표시하기 위한 최소한의 코드만 포함되어야 하며, 많은 처리나 계산을 수행해서는 안 되며, 모델에서 계산(또는 요약)하거나 컨트롤러에서 생성된 데이터를 표시해야 합니다.뷰가 모델이나 컨트롤러에서 수행할 수 없는 처리를 실제로 수행해야 하는 경우 코드를 도우미에 넣으세요.뷰에 Ruby 코드가 많으면 페이지 마크업을 읽기가 어렵습니다.

모델:귀하의 모델은 다음 위치에 있어야 합니다. 모두 데이터와 관련된 코드(사이트를 구성하는 엔터티, 예:사용자, 게시물, 계정, 친구 등)이 살고 있습니다.코드에서 엔터티와 관련된 데이터를 저장, 업데이트 또는 요약해야 하는 경우 여기에 입력하세요.뷰와 컨트롤러 전체에서 재사용이 가능합니다.

다른 팁

Pauliephonic의 답변에 추가하려면 다음을 수행하십시오.

돕는 사람:뷰를 더 쉽게 생성하는 기능입니다.예를 들어 가격을 표시하기 위해 항상 위젯 목록을 반복하는 경우 이를 도우미에 넣으세요(실제 표시를 위한 부분과 함께).또는 뷰를 복잡하게 만들고 싶지 않은 RJS 조각이 있는 경우 이를 도우미에 넣으세요.

MVC 패턴은 실제로 UI에만 관련되며 다른 것은 없습니다.컨트롤러는 뷰를 제어하지만 로직은 제어하지 않으므로 복잡한 비즈니스 로직을 컨트롤러에 넣어서는 안 됩니다.컨트롤러는 적절한 보기를 선택하는 데 관심을 갖고 더 복잡한 내용을 도메인 모델(모델) 또는 비즈니스 계층에 위임해야 합니다.

도메인 기반 디자인에는 일반적으로 Model 클래스에 자연스럽게 속하지 않는 논리를 의미하는 다양한 유형의 개체를 조정하는 데 필요한 논리를 고정하는 장소인 서비스 개념이 있습니다.

나는 일반적으로 서비스 계층을 내 애플리케이션의 API로 생각합니다.내 서비스 레이어는 일반적으로 내가 만들고 있는 애플리케이션의 요구 사항과 매우 밀접하게 매핑되므로 서비스 레이어는 내 앱의 하위 수준에서 발견되는 더 복잡한 상호 작용을 단순화하는 역할을 합니다.서비스 계층을 우회하여 동일한 목표를 달성할 수 있지만 이를 작동시키려면 훨씬 더 많은 레버를 당겨야 합니다.

여기서는 Rails에 대해 이야기하는 것이 아니라 특정 문제를 해결하는 일반적인 아키텍처 스타일에 대해 이야기하고 있다는 점에 유의하세요.

여기에는 이미 완벽한 설명이 있습니다. 결론적으로 매우 간단한 문장으로 기억하기 쉽습니다.

SMART 모델, THIN 컨트롤러 및 DUMB 뷰가 필요합니다.

http://c2.com/cgi/wiki?ModelViewController

컨트롤러에 인증/액세스 제어와 관련된 내용을 넣으세요.

모델은 데이터에 관한 것입니다.검증, 관계, CRUD, 비즈니스 로직

뷰는 데이터를 표시하는 것입니다.표시하고 입력만 받습니다.

컨트롤러는 모델에서 뷰(및 어떤 뷰)로, 뷰에서 모델로 이동하는 데이터를 제어하는 ​​것입니다.컨트롤러는 모델 없이도 존재할 수 있습니다.

저는 컨트롤러를 고객(요청)을 창구 직원(보기)에게 질문하는 적절한 카운터로 안내하는 경비원/접수원으로 생각하고 싶습니다.그런 다음 창구 직원(뷰)이 가서 한 번도 본 적이 없는 관리자(모델)로부터 답변을 받습니다.그런 다음 요청은 경비원/접수원(컨트롤러)에게 돌아가서 다른 창구(보기)의 질문에 대한 응답으로 관리자(모델)가 말한 답변을 알려주는 다른 창구(보기)로 가도록 지시될 때까지 기다립니다. .

마찬가지로 창구 직원(보기)에게 무언가를 말하고 싶다면 두 번째 창구 직원이 관리자가 귀하의 정보를 수락했는지 여부를 알려줄 것이라는 점을 제외하면 거의 동일한 일이 발생합니다.귀하가 관리자에게 해당 정보를 알릴 권한이 없기 때문에 경비원/접수원(관제사)이 귀하에게 하이킹을 하라고 지시했을 수도 있습니다.

따라서 은유를 확장하자면, 고정관념적이고 비현실적인 세계에서 창구 직원(관찰자)은 예쁘지만 머리가 비어 있고 당신이 말하는 것은 무엇이든 믿는 경우가 많습니다. 경비원/접수원은 최소한의 예의를 갖추었지만 지식이 많지는 않지만 사람들이 어디에서 가야 하는지 알고 있습니다. 가지 말아야 하고 관리자들은 정말 추악하고 비열하지만 모든 것을 알고 무엇이 진실이고 무엇이 거짓인지 말할 수 있습니다.

적절하게 분리하는 데 도움이 되는 한 가지는 "컨트롤러에서 뷰로 로컬 변수 전달" 안티 패턴을 피하는 것입니다.대신에:

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  def show
    @foo = Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= @foo.bar %>
...

도우미 메서드로 사용할 수 있는 getter로 이동해 보세요.

# app/controllers/foos_controller.rb:
class FoosController < ApplicationController

  helper_method :foo

  def show
  end

  protected

  def foo
    @foo ||= Foo.find(...)
  end

end

#app/views/foos/show.html.erb:
...
<%= foo.bar %>
...

이렇게 하면 "@foo"에 들어가는 내용과 사용 방법을 수정하기가 더 쉬워집니다.컨트롤러와 뷰를 더 이상 복잡하게 만들지 않으면서 분리가 증가합니다.

글쎄요, 그것은 논리가 무엇을 다루어야 하는지에 달려 있습니다...

종종 모델에 더 많은 것을 추가하고 컨트롤러를 작게 두는 것이 합리적입니다.이렇게 하면 모델이 나타내는 데이터에 액세스해야 하는 모든 곳에서 이 논리를 쉽게 사용할 수 있습니다.뷰에는 논리가 거의 포함되지 않아야 합니다.따라서 일반적으로 반복하지 않도록 노력해야 합니다.

또한 Google을 조금 검색해 보면 무엇이 어디로 가는지에 대한 몇 가지 구체적인 예가 나와 있습니다.

모델:유효성 검사 요구 사항, 데이터 관계, 생성 방법, 업데이트 방법, 삭제 방법, 찾기 방법(이러한 방법의 일반 버전뿐만 아니라 빨간 머리를 가진 사람을 찾는 것과 같이 자주 수행하는 작업이 있는 경우) 성, 그런 다음 find_redH_by_name("smith") 또는 이와 유사한 것을 호출하기만 하면 되도록 해당 논리를 추출해야 합니다.

보다:이는 데이터 처리가 아니라 데이터 형식에 관한 것이어야 합니다.

제어 장치:여기가 데이터 처리가 이루어지는 곳입니다.인터넷에서:"컨트롤러의 목적은 사용자가 요청한 작업에 응답하고, 사용자가 설정한 매개변수를 사용하고, 데이터를 처리하고, 모델과 상호 작용한 다음, 요청한 데이터를 최종 형식으로 뷰에 전달하는 것입니다."

도움이 되길 바랍니다.

쉽게 말하면 일반적으로모델 테이블과 관련된 모든 코드, 단순하거나 복잡한 관계(여러 테이블을 포함하는 SQL 쿼리로 생각), 비즈니스 로직을 사용하여 결과에 도달하기 위한 데이터/변수 조작이 포함됩니다.

컨트롤러 요청된 작업에 대한 관련 모델에 대한 코드/포인터가 있습니다.

견해 사용자 입력/상호작용을 수락하고 결과 응답을 표시합니다.

이들로부터 크게 벗어나면 해당 부분에 원치 않는 부담이 가해지고 전체 애플리케이션 성능이 영향을 받을 수 있습니다.

테스트, 테스트 ...모델에 가능한 한 많은 로직을 넣으면 제대로 테스트할 수 있습니다.단위 테스트는 모델을 테스트하여 데이터와 데이터가 형성되는 방식을 테스트하고, 기능 테스트는 컨트롤러를 테스트하여 데이터가 라우팅되거나 제어되는 방식을 테스트하므로 데이터가 포함되어 있지 않으면 데이터의 무결성을 테스트할 수 없습니다. 모델.

제이

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top