【发布时间】:2011-04-28 20:42:36
【问题描述】:
总结
在Sinatra Web 应用程序中,如何向应用程序发出虚拟请求并将响应正文作为文本返回?比如这些路线……
get('/foo'){ "foo" }
get('/bar'){ "#{spoof_request '/foo'} - bar" }
...当使用网络浏览器请求“/bar”时,应该会导致响应“foo - bar”。
动机
我的应用程序有一个代表错误条目的页面,其中包含有关该错误条目的许多详细信息:错误出现在哪个版本中,它有多重要,与之相关联的标签,错误分配给谁等.
用户可以交互地编辑此页面上的个别数据。使用我的AJAXFetch jQuery 插件,JavaScript 使用 AJAX 将页面的只读部分(例如,此错误分配给的人的姓名)替换为 HTML 部分表单,以便仅编辑该部分。用户提交表单,AJAX 对该字段的静态版本发出新请求。
为了成为DRY,我希望创建页面的Haml 视图使用AJAX 在创建单个静态片段时发出的完全相同的请求。例如:
#notifications.section
%h2 Email me if someone...
.section-body= spoof_request "/partial/notifications/#{@bug.id}"
不完全工作的代码
以下定义 spoof_request 的助手在 Sinatra 1.1.2 下工作:
PATH_VARS = %w[ REQUEST_PATH PATH_INFO REQUEST_URI ]
def spoof_request( uri, headers=nil )
new_env = env.dup
PATH_VARS.each{ |k| new_env[k] = uri.to_s }
new_env.merge!(headers) if headers
call( new_env ).last.join
end
但是,在 Sinatra 1.2.3 下,这不再有效。尽管将每个 PATH_VARS 设置为所需的 URI,call( new_env ) 仍然会导致 Sinatra 处理当前请求的路由,而不是指定路径。 (这会导致无限递归,直到堆栈级别最终触底。)
此问题与 Calling Sinatra from within Sinatra 不同,因为该(旧)问题的已接受答案不会维持用户的会话。
【问题讨论】: