Как мне динамически добавить постфильтр в Rails из действия контроллера? - PullRequest
1 голос
/ 29 марта 2012

Каждый раз, когда пользователь заходит на страницу в моем приложении Rails, база данных должна отправлять ему Thingy. Когда в базе данных заканчиваются Thingies, она должна выполнить дорогостоящую обработку, чтобы генерировать больше. Я хочу добавить фильтр контроллера динамически, чтобы генерировать штуковины после ответа, отправленного пользователю, чтобы он не влиял на время загрузки страницы. Вот как выглядит мой контроллер:

class ThingyController < ApplicationController

  def get_a_thingy
    if Thingy.count <= 5 
      # Only five thingies left! we need to generate some more. 
      # I want to dynamically send a block to an after_filter: here to  
      # generate thingies after the controller sends the response  
      # because generating thingies is really slow
    end

    # Pop the first thingy from the database and return
    thingy = Thingy.first
    thingy.delete 
    return thingy.content
  end

Что можно добавить в функцию get_a_thingy, чтобы это произошло?

Ответы [ 3 ]

1 голос
/ 29 марта 2012

Вы можете попробовать некоторые инструменты фоновой обработки (https://www.ruby -toolbox.com / Categories / Background_Jobs отметьте это), потому что я не уверен, что вы можете сделать это внутри обработчика запросов.

Вы также можете попытаться вернуть весь контент пользователю (через что-то вроде потоковой передачи по протоколу http) и только потом делать тяжелые вещи.

0 голосов
/ 17 мая 2012

Вероятно, лучшая идея для такого камня - delayed_job , для него также есть railscast .

Задержка является асинхронно приоритетной системой очередей.

  • Установите и настройте delayed_job. Это довольно хорошо задокументировано на github page .

  • Начать рабочий с rake jobs:work

  • Теперь просто измените свой код для использования задания задержки, добавив метод .delay

class ThingyController < ApplicationController
  after_filter :generate_thingies
  .
  .
  .
  def generate_thingies
    if Thingy.count <= 5
      #change
      Thingy.generate_thingies
      #to
      Thingy.delay.generate_thingies
    end
  end
end

ПРИМЕЧАНИЕ. Это небольшой учебник, и я упустил некоторые вещи, которые понадобятся вам для его работы. Я рекомендую вам проверить страницу Github для полной документации.

0 голосов
/ 29 марта 2012

Просто поместите оператор if, который проверяет количество штук в вашем after_filter коде:

class ThingyController < ApplicationController
  after_filter :generate_new_thingies

  def get_a_thingy
    thingy = Thingy.first
    thingy.delete
    return thingy.content
  end

  def generate_new_thingies
    if Thingy.count <= 5
      # Generate thingies
    end
  end
end

Действительно ли использование after_filter предотвращает длительную загрузку страницы? Может быть лучше взглянуть на что-то вроде Задержка работы или Всякий раз .

...