Как кешировать частичное представление File.exists? проверяет жизнь приложения в Rails - PullRequest
0 голосов
/ 24 октября 2009

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

Так что в настоящее время я делаю следующее (псевдокод):

polymorphs.each do |poly|
    if File.exists?( File.join( RAILS_ROOT, 'app', 'views', poly.type, '_alternate.html.erb' ) )
        partial = "#{poly.type}/alternate"
    else
        partial = "#{poly.type}/original"
    end
    ...
end

Это работает нормально, но это очевидное узкое место. Поэтому я хочу выполнить эти проверки на наличие этих альтернативных частичных раз только один раз, а затем кэшировать их.

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

1 Ответ

2 голосов
/ 24 октября 2009

Поместите его в отдельный метод класса и используйте memoize .

class FooController
  class << self
    extend ActiveSupport::Memoizable
    def find_path_for(type)
      if File.exists?( File.join( RAILS_ROOT, 'app', 'views', poly.type, '_alternate.html.erb' ) )
        partial = "#{poly.type}/alternate"
      else
        partial = "#{poly.type}/original"
      end
    end
    memoize :find_path_for
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...