加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 如何从Rails 3中的模型进行路由和渲染(调度)

发布时间:2020-12-17 02:53:12 所属栏目:百科 来源:网络整理
导读:我想从模型中调度(路由和渲染). (我只关心GET请求,我忽略了Accept:headers,所以我只看PATH_INFO.) # app/models/response.rbclass Response ActiveRecord::Base # col :path_info # col :app_version # col :body,:type = :text def set_body params = Rail
我想从模型中调度(路由和渲染). (我只关心GET请求,我忽略了Accept:headers,所以我只看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 request dispatch cycle

解决方法

它实际上比那更容易:

session = ActionDispatch::Integration::Session.new(Rails.application)
session.get(path_info)
self.body = session.response.body

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读