Category: Rails

Using Rails Sweepers outside controllers

Sweeper outside?

Sometimes we modify some stuff without controllers (for example we publish some stuff via rake task ignited by cron). Unfortunately Rails does not handle it "out of the box", so we need to do it by ourselfs.

BaseSweeper

Let's create a base sweeper class where all the "magic" will happen:

class BaseSweeper < ActionController::Caching::Sweeper

  def after_save(data)
    expire_data(data)
  end

  def after_destroy(data)
    expire_data(data)
  end

  def expire_data
    @controller ||= ActionController::Base.new
  end

end

There's nothing special about this code, except:

@controller ||= ActionController::Base.new

This line will emulate (if needed) controller outside of standard Rails flow. Thanks to this we can sweep stuff whenever we need. Example:

class NewsSweeper < BaseSweeper

  observe News

  def expire_data(data)
      super
      expire_fragment /news_#{data.id}/
  end

end

There's one more thing to do. We need to add sweeper to observers in application.rb file (so our sweeper will react on any change in observed model):
application.rb:

    config.active_record.observers =
      "CommentObserver",
      "JakistamInnyObserver",
      # Sweepery
      "NewsSweeper"

Rails3 i routes.rb – rozbicie (rozłożenie) na kilka plików

Wraz z rozrostem naszej aplikacji, zaczynają pojawiać się w niej przestrzenie nazw/moduły (namespaces). Dzięki takiemu podziałowi możemy zachować logikę w aplikacji dzieląc ją (przykład) np. na:

  • api
  • admin
  • dev

Wygodnie byłoby móc odwzorować taki podział także na pliku routes.rb, który niestety z czasem będzie rósł coraz bardziej. Aby temu zapobiec (i zapanować nad ew. rozrostem), warto rozdzielić plik routes.rb. Jak tego dokonać? Wystarczy utworzyć sobie katalog config/routes w nim utworzyć swoją herarchię plików (może być zagnieżdzona w subkatalogach). Następnie należy dodać poniższe linijki do pliku config/application.rb:

    # Ładuj wszystkie routy z katalogu config/routes
    Dir["#{Rails.root}/config/routes/**/*.rb"].each do |route_file|
      config.paths.config.routes << route_file
    end

Powyższy kod przeszukuje rekurencyjnie katalog z routsami i załącza te na które natrafi.

Copyright © 2026 Closer to Code

Theme by Anders NorenUp ↑