Chciałbym z poziomu kodu (tudzież w konsoli) wywołać konkretną akcję aplikacji. Za czasów Rails 2 robiło się to poprzez obiekt app – app.get i app.post wystarczały do wszystkiego.
Niestety w Rails 3 app jest nil. Co robić?
OK, disregard, jednak jest app i tym samym app.get – coś spaprałem
OK, app jest, ale nie w rake taskach. Halp?
railsapp = Rails::Application.instance
app = ActionDispatch::Integration::Session.new(railsapp)
Nie wiem komu z ekipy Rails 3 przeszkadzał obiekt app w rake taskach
Ja bym powiedział że ten obiekt jest tak brzydki że nie powinno go być, a na pewno nie powinien się nazywać “app” i siedzieć w globalnej przestrzeni nazw…
Pod spodem to prawdopodobnie wykorzystuje jakiś MockRequest. Moża to zrobić też na niższym poziomie:
require 'rack/test'
env = Rack::MockRequest.env_for("/")
response = Rails.application.call(env)
response[2].body
Tutaj oczywiście lepiej wykorzystać Integration::Session, jakkolwiek brzydka ta klasa nie jest, ale pokazuję jakby ktoś się zastanawiał jak można to inaczej zrobić.