Лучший способ отображения данных модели в мастер-макете в среде MVC - PullRequest
2 голосов
/ 28 февраля 2009

У меня есть простое приложение rails, которое использует мастер-макет для всех страниц. Я хотел бы иметь нижний колонтитул в этом макете, который отображает данные из модели, чтобы вы могли видеть данные независимо от того, на какой странице вы находитесь.

В настоящее время у меня есть только один контроллер с несколькими очень простыми представлениями, которые отображаются в макете без каких-либо методов действий, определенных в контроллере. В макете есть что-то вроде:

<div id="footer"><%= controller.get_data %></div>

Где get_data, конечно, просто извлекает данные из модели. Это кажется плохим способом сделать это, потому что я не могу добавить больше контроллеров, не нарушая компоновку.

Мой вопрос: каков наилучший способ получения данных из модели для отображения в основном макете, когда запрос может быть обработан любым контроллером, отображающим любое представление в этом макете? Где должен быть определен get_data, или какой более понятный способ справиться с этим?

Ответы [ 2 ]

1 голос
/ 28 февраля 2009

Вы можете сделать что-то вроде этого:

Определение переменных экземпляра контроллера общего назначения с помощью методов доступа, где хранится текущий класс модели и экземпляр:

class ApplicationController
  attr_accessor :current_model_class, :current_model_instance
  helper_method :current_model_class, :current_model_instance
end

В частности, контроллер присваивает им значения (вы можете поместить их также в некоторые фильтры до или после):

class SomeController < ApplicationController
  def index
    self.current_model_instance = SomeModel.find(params[:id])
    self.current_model_class = SomeModel
  end
end

Определите одинаковые методы класса и экземпляра во всех моделях, которые будут получать данные для макета:

class SomeModel < ActiveRecord::Base
  def self.get_data
    # get class specific data
  end

  def get_data
    # get instance specific data
  end

end

И используйте его в файле макета:

<div id="footer"><%= current_model_instance.get_data %></div>

или

<div id="footer"><%= current_model_class.get_data %></div>
0 голосов
/ 22 апреля 2011

Вы также можете сделать это, используя before_filter в ApplicationController:

class ApplicationController < ActionController::Base
   before_filter :set_footer_data

   def set_footer_data
      @footer_data = MyModel.find(params[:id])
   end
end

и затем в вашем макете:

<div id="footer"><%= @footer_data %> </div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...