Всегда ли плохо добавлять код контроллера в представление? - PullRequest
2 голосов
/ 08 февраля 2011

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

<%= link_to "Upgrade (costs #{ Skill.get_profession_cost('Admin')} gold)" ...

В этом примере мне нужно получить стоимость профессии для более чем одной роли (Администратор, Пользователь и более). Поэтому существует много ссылок, подобных приведенной выше. Теперь вопрос в том, что является лучшей практикой для этого. Я могу придумать 3 способа:

  1. Как показано выше.

  2. Используйте помощника и получите стоимость (недостаток - мне все равно нужна функция get_profession_cost в модели, так как я использую ее в контроллере; таким образом, помощник мне кажется немного избыточным). Более того, я считаю помощника кодом, который все равно должен быть в контроллере.

  3. Получите заранее организованный хеш, например:

Пользователь => 1000, Администратор => 3000 ... и более. Это более громоздко и довольно утомительно для создания.

Мне бы очень хотелось ваше мнение. Есть ли лучший способ, и если нет, какой бы вы предпочли?

Ответы [ 2 ]

5 голосов
/ 08 февраля 2011

Мой порядок предпочтений всегда

  1. Модель
  2. Помощник
  3. Контроллер
  4. Вид

Этохорошо, что у вас есть метод на вашей модели.Я бы сказал, что сделаю еще один шаг и добавлю метод класса в вашу модель, который получает хэш всех затрат на профессию.Преимущество этого состоит в том, что вы, вероятно, можете сделать один запрос к БД (который будет кешироваться), а не один для каждой профессии.Держите ваши контроллеры как можно более тонкими.

Затем вы можете получить хеш в любом месте контроллера, в котором он вам нужен (или использовать фильтр, чтобы добавить его во многих местах).

Я бы добавил помощника, который генерирует строку (а не только число)

(costs 12 gold) 

, если она используется несколько раз.

0 голосов
/ 08 февраля 2011

Я бы попытался содержать все вычисления в контроллере.

Примером включения кода Ruby в представление может быть:

- if boolean_2
    % some_html
-if boolean_2
    % other_html

(синтаксис Haml)

Логические 1 и 2 будут установлены в контроллере, представление будет использовать результат.

Конечно, для небольших объемов кода, таких как ваш пример выше, это, вероятно, не имеет значения. Обычно я сохраняю как можно больше вызовов методов в контроллере и передаю хэши между представлением и контроллером.

Только мое мнение.

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