Не нарушает ли парадигма MVC доступ к базе данных в представлениях через модели представления или помощники представления? - PullRequest
1 голос
/ 29 декабря 2011

Я полагаю, что все последующее нарушает парадигму 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. Доступ к базе данных через модель представления

    # 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. Доступ к веб-серверу для получения данных через модель представления

    # 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 голос
/ 29 декабря 2011

Для 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/

...