Лучшая практика для сушки отображения одинаковых данных модели почти на каждой странице - PullRequest
0 голосов
/ 11 октября 2010

Я разрабатываю сайт объявлений, который будет отображать одну и ту же боковую панель почти на каждой странице.Список категорий, которые извлекаются из базы данных.

Я дублирую один и тот же код на каждом контроллере, чтобы сделать это.т. е.

before_filter :load_categories

Где: load_categories выполняет простое

private

def load_categories
  @categories = Category.all
end

Не очень сухо, когда у вас много контроллеров.этот процесс?

Ответы [ 3 ]

3 голосов
/ 11 октября 2010

Вы можете поставить это на ApplicationController, но, честно говоря, я рекомендую против этого.ApplicationController имеет тенденцию становиться большим раздутым шариком с течением времени, накапливая служебные функции, которые на самом деле не связаны, определенно не SRP.Это может стать уродливым.

То, что я сделал, чтобы сохранить СУХОЕ состояние, - это создание родительского контроллера, от которого могут наследоваться связанные контроллеры.Поместите свой before_filter в него и получите от него наследуемые контроллеры, использующие категории.

Может быть:

class MainPagesController < ApplicationController
  before_filter :load_categories

  private

  def load_categories
    @categories = Category.all
  end
end

class SomeController < MainPagesController
  # etc.
end

Если ваше приложение маленького размера, оно не будет значительно расти со временеми вы действительно загружаете @categories почти на всех своих страницах, тогда может иметь смысл поместить их в ApplicationController.Но я склонен ошибаться из-за чрезмерной сушки моего кода.Очень маленькие классы с изолированной функциональностью никогда не бывает плохим.

0 голосов
/ 11 октября 2010

Вы можете поместить свой метод в ApplicationController и ваш before_filter тоже.

Если вы хотите избежать этого в одном конкретном контроллере, вы можете пропустить его после

0 голосов
/ 11 октября 2010

Вы можете поместить def load_categories определение в ApplicationController, и оно будет доступно с любого контроллера в вашем приложении.
Вы можете также поставить before_filter :load_categories в ApplicationController, если хотите, чтобы оно выполнялось для каждогоcontroller.

Хотя, честно говоря, мне не кажется, что это избыточный код.На самом деле, просто вызывать Category.all в каждом действии / представлении, где вам нужны категории, может быть проще.Поскольку результаты кэшируются, производительность не снижается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...