Как выполнить маршрутизацию и рендеринг (отправку) из модели в Rails 3

Я хочу отправить (маршрут и рендеринг) из модели. (Я забочусь только о GET запросы и я игнорирую Accept: заголовки, так что я смотрю только на PATH_INFO.)

# app/models/response.rb
class Response < ActiveRecord::Base
  # col :path_info
  # col :app_version
  # col :body, :type => :text

  def set_body
    params = Rails.application.routes.recognize_path(path_info, :method => :get)
    controller = "#{params[:controller].camelcase}Controller".constantize.new
    controller.action_name = params[:action]
    controller.request = ActionDispatch::Request.new('rack.input' => [])
    controller.request.path_parameters = params.with_indifferent_access
    controller.request.format = params[:format] || 'html'
    controller.response = ActionDispatch::Response.new
    controller.send params[:action]
    self.body = controller.response.body
  end
end

Приведенный выше код работает, но кажется неуклюжим. Какой правильный способ сделать это? Я представляю, как Yehuda Katz скажет мне что-то вроде:

def set_body
  # [...]
  app = "#{params[:controller].camelcase}Controller".constantize.action(params[:action])
  app.process params
  self.body = app.response.body
end

FWIW вот мой файл маршрутов:

# config/routes.rb
MyApp::Application.routes.draw do
  resources :products                                       # GET /products.json?merchant_id=foobar
  match '/:id(.:format)' => 'contents#show', :via => 'get'  # GET /examples
  root :to => 'contents#index', :via => 'get'               # GET /
end

Смотрите также: Цикл отправки запроса Rails 3

1 ответ

Решение

На самом деле это даже проще, чем это:

session = ActionDispatch::Integration::Session.new(Rails.application)
session.get(path_info)
self.body = session.response.body
Другие вопросы по тегам