我正在尝试执行一个控制器操作,该操作从一组给定的路由名称呈现一个随机路由而没有重定向。
我知道方法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来呈现而不需要重定向。
答案 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