Я хочу отправить (маршрут и рендеринг) из модели. (Меня интересуют только запросы 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
Приведенный выше код работает, но кажется неуклюжим. Какой правильный способ сделать это? Я представляю, что Иегуда Кац скажет мне что-то вроде:
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