2011-12-29 67 views
1

我相信以下所有內容都打破了MVC範式,但是想要仔細檢查是否屬於這種情況。在所有情況下,視圖直接訪問數據而不是傳遞數據。從我對MVC的理解來看,它絕不應該這樣做。控制器應該獲取呈現視圖所需的所有數據,以便不直接耦合視圖和模型。我的理解是否正確?通過視圖模型或視圖助手在視圖中訪問數據庫是否打破了MVC模式?

  1. 通過視圖助手

    # in app/helpers/view_helper.hrb 
    def some_view_helper(person_id) 
        @person = Person.find(person_id) 
    end 
    
  2. 訪問數據庫通過視圖助手

    # 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 
    
  3. 訪問另一臺Web服務器通過視圖模型訪問數據庫

    # 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 
    
  4. 訪問Web服務器通過視圖模型

    # 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是差了些,因爲你正在做的視圖外部Web服務調用。不要這樣做。

這篇文章有什麼樣的理想的清潔視圖看起來像一個很好的例子:http://warpspire.com/posts/mustache-style-erb/

+0

謝謝你好,你的答覆。獲取數據的各種方式都超級簡化。我的問題不是哪一個更好,也不是如何讓我的代碼更好。我想知道是否所有4種情況都違反了MVC範例,因爲在每個實例中,視圖代碼都是訪問數據庫或獲取數據。謝謝! – user139078

相關問題