基于(随机)路径名称的渲染动作

时间:2017-01-04 15:51:17

标签: ruby-on-rails ruby-on-rails-4

我正在尝试执行一个控制器操作,该操作从一组给定的路由名称​​呈现一个随机路由而没有重定向

我知道方法render controller: name, action: name,但渲染失败,因为它试图自己找到一个模板,而不是让目标操作决定模板。

这是我的代码:

def random
  # create basic route names
  route_names = %w(root route1 route2)

  # get route path
  path = Rails.application.routes.url_helpers.send("#{route_names.sample}_path")

  # {controller: name, action: name, param: val}
  action_config = Rails.application.routes.recognize_path(path, {:method => :get})

  # doesn't work
  # fails with Missing template application/*action name*
  return render action_config

  # doesnt work
  # require 'open-uri' 
  # render html: open("http://localhost:3000/#{path}") { |io| io.read }

  # doesn't work
  # require 'net/http'
  # require 'uri'
  # render html: Net::HTTP.get(URI.parse("http://localhost:3000/#{path}"))

  # doesnt work
  # ctrl = (action_config[:controller].camelize + "Controller").constantize.new
  # ctrl.request = request
  # ctrl.response = response
  # ctrl.send(action_config[:action])

  # works, but not for Derailed
  # redirect_to path

  # works but not for Derailed, since the server doesn't parse the <iframe>
  #render html: "
  #  <iframe 
  #    src='#{path}' 
  #    width='100%' 
  #    height='100%' 
  #    style='overflow: visible; border: 0;'></iframe>
  #  <style>body {margin: 0;}</style>".html_safe
end

有人能让render正常工作吗?

背景

我正在尝试在我的Rails应用程序中调试内存泄漏。我正在使用Derailed gem从我的应用程序中检索路径10.000次。出轨仅支持击中单个路径。因此,为了实际模仿网站使用,我正在尝试实现一个从一组给定路由呈现随机路由的操作。 Derailed允许我使用像Puma这样的真实网络服务器,但是该配置不遵循重定向,所以我需要Rails来呈现而不需要重定向。

2 个答案:

答案 0 :(得分:0)

您可以尝试在控制器中打开新的应用程序会话,在那里呈现操作并返回结果:

session = ActionDispatch::Integration::Session.new(Rails.application)
session.get '/'
render html: session.body

答案 1 :(得分:0)

您可以为此编写中间件:

class RandomMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    route_names = %w(/ /route1 /route2)
    if env['PATH_INFO'] == '/random'
      env['PATH_INFO'] = route_names.sample
    end

    @app.call(env)
  end
end

然后将此中间件插入堆栈(在config/application.rb中):

config.middleware.use RandomMiddleware