2011-12-29 2 views
1

다음 모든 것이 MVC 패러다임을 깨뜨렸다고 생각하지만이 경우 두 번 확인하고 싶습니다. 모든 경우에 뷰는 데이터가 전달되는 대신 직접 데이터에 액세스합니다. MVC를 이해하면 절대로이를 수행해서는 안됩니다. 컨트롤러는 뷰를 렌더링하는 데 필요한 모든 데이터를 가져와 뷰와 모델을 직접 연결하지 않아야합니다. 내 이해가 맞습니까? 뷰 모델을 통해 데이터베이스를 액세스하는 뷰 도우미보기 모델 또는보기 도우미를 통해보기에서 데이터베이스에 액세스하면 MVC 패러다임이 깨지십니까?

# in app/helpers/view_helper.hrb 
def another_view_helper(person_id) 
    # makes http request over the wire to get json back 
    @json = WebService.get_person(person_id) 
end 
  • 을 통해 다른 웹 서버에 액세스 뷰 도우미

    # in app/helpers/view_helper.hrb 
    def some_view_helper(person_id) 
        @person = Person.find(person_id) 
    end 
    
  • 통해 데이터베이스에 액세스

    1. # in apps/controller/person_controller.rb 
      def show 
          @person = Person.find(params[:id]) 
          @page_model = PageModel.new(@person) 
      end 
      
      #in app/views/persons/show.html.erb 
      <% @page_model.friends.each do |friend| %> 
          ... 
      <% end %> 
      
      #in app/models/person.rb 
      class Person < ActiveRecord::Base 
          has_many :friends 
      end 
      
      #in app/models/page_models/page_model.rb 
      def initialize(person) 
          @person = person 
      end 
      
      def friends 
          @person.friends 
      end 
      
    2. ,210
    3. 액세스 웹 서버 뷰 모델

      # in apps/controller/person_controller.rb 
      def show 
          @person = Person.find(params[:id]) 
          @page_model = PageModel.new(@person) 
      end 
      
      #in app/views/persons/show.html.erb 
      <% @page_model.friends.each do |friend| %> 
          ... 
      <% end %> 
      
      #in app/models/page_models/page_model.rb 
      def initialize(person) 
          @person = person 
      end 
      
      def friends 
          WebService.get_friends_for_person(person_id) 
      end 
      
  • 답변

    1
    경우 1

    2를 통해 데이터를 얻을, 당신은 단지 컨트롤러의 인스턴스 변수 (@person)을 설정할 수 있습니다.

    3의 경우보기 코드가 그렇게 나쁘지는 않지만 별도의 페이지 모델을 사용해야하는 이유는 무엇입니까? 또한 컨트롤러 앞까지 친구를로드 할 수 있습니다 : 당신이보기에서 외부 웹 서비스 호출을하고있는 이후

    # in apps/controller/person_controller.rb 
    def show 
        @person = Person.find(params[:id], :include => :friends) 
        @friends = @person.friends 
    end 
    

    예 4는, 조금 더 나쁘다. 그러지 마. 당신의 응답을, http://warpspire.com/posts/mustache-style-erb/

    +0

    안녕하세요 감사 :

    이 문서는 이상적인 깨끗한 뷰가 어떻게 보이는지의 좋은 예제가 실려있다. 데이터를 가져 오는 다양한 방법은 매우 간단했습니다. 제 질문은 어떤 것이 더 낫지 않거나 제 코드를 개선하는 방법도 아닙니다. 각 인스턴스보기 코드에서 데이터베이스에 액세스하거나 데이터를 가져 오는 중 4 가지 경우 모두 MVC 패러다임을 위반하는지 궁금합니다. 감사! – user139078