Контроллер кода действия кода некорректен, но ошибка молчит - PullRequest
0 голосов
/ 26 сентября 2011

Вот мой пользовательский контроллер шоу действий

def show
    @public_groups = Group.public
    @groups_member = @user.groups_as_member
    @groups_as_owner = @user.groups_as_owner

    @random_items = []
    @assignments = []
    unless @groups_member.nil?
      until @random_items.count == 5 do
        random_groups = @groups_member.sort_by{rand}.slice(0,5)
        random_groups.each do |group|
          assignments = Assignment.where(:group_id => group.id).limit(5).all
          #assignments = Assignment.find_by_group_id(group.id)
          y = Post.find_by_id(assignments.rand.post_id)
          @random_items << y
        end
      end 
    end
  end

Я думаю, это может быть способ объявления массивов переменных экземпляра @random_items и @assignments. Я понятия не имею, в чем проблема, потому что мои серверы разработки и производства не дают никаких ошибок компиляции или чего-то еще.

Когда я закомментирую большой блок логики, начиная с объявлений массива, сайт работает.

1 Ответ

1 голос
/ 26 сентября 2011

Я бы посоветовал вам выполнить рефакторинг, прежде чем вы сможете найти ошибку. Некоторые принципы раньше:

  • Любой поток данных касается ответственности уровня модели
  • переменные экземпляра используются для совместного использования объектов между слоями ActionPack (контроллер и представление)
  • использовать атрибуты объекта вместо переменных экземпляра для удобства тестирования
  • используйте ассоциации и минимизируйте метод Ареля и просто найдите в контроллерах

С помощью вашего кода, его можно переписать с помощью:

  # User model
  def random_items
    return unless groups_as_member
    random_groups = groups_member.sort_by{rand}.slice(0,5)

    random_groups.each do |group|
      return if randorm_groups.length > 5
      assignments = group.assignments.limit(5)
      if y = Post.rand_by_post(assignments)
        random_groups << y
      end
    end

    return random_groups
  end


  # Post model
  def self.rand_by_post(assignments)
    find_by_id(assignments.rand.post_id)
  end

Как только вы проясните логику, вы можете найти ошибку и покрыть ее тестами.

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