Rails перемещает запросы от представления к контроллеру - PullRequest
0 голосов
/ 28 марта 2011

Получил этот код для просмотра и контроллера:

# matches/show.html.haml
%h3
  Players

-@clans.each do |clan|
  %h4=link_to clan.name, clan
  %ul
    -@players.find_all_by_clan_id(clan.id).each do |player|
      %li
        %strong=link_to player.name, player


%h3
-@rounds.each_with_index do |round,index|
  %h4
    Round
    =index+1

  -@clans.each do |clan|
    %h4=clan.name
    %ul
      -round.participations.includes(:player,:champion).find_all_by_clan_id(clan.id).each do |participation|
        %li
          =participation.player.name
          =participation.champion.name

# matches_controller.rb

class MatchesController < ApplicationController
  def index
    @matches = Match.played.includes(:clans).page(params[:page])

  end

  def show
    @match = Match.includes(:rounds,:clans).find(params[:id])
    @clans = @match.clans
    @rounds = @match.rounds

    @players = @match.players

  end
end

Как переместить все ненужные запросы к базе данных, логику и т. Д. Из представления в контроллер?
Может быть, упростить это как-нибудь?

1 Ответ

0 голосов
/ 28 марта 2011

Переместите его в модель Match, а не в контроллер. Ваш контроллер обычно должен содержать только логику маршрутизации и установку переменной экземпляра для использования в представлении. Основная часть кода должна идти в модели. Тощие контроллеры, толстые модели.

Читайте об областях применения:
http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html

Кроме того, эта статья написана в 2006 году (предварительные статьи), но большая ее часть все еще актуальна для вашего вопроса:
http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model

Вам действительно не нужно устанавливать переменные экземпляра для кланов, раундов и игроков. Вы можете получить к ним доступ непосредственно из @match в простых ситуациях, когда вы выполняете итерацию по связанной коллекции. Например:

-@match.clans.each do |clan|

В противном случае, используйте область видимости, если она чем-то более сложным, чем простая ассоциация has_many / own_to.

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