在Sinatra Web应用程序中,如何向应用程序发出虚拟请求并将响应正文作为文本返回?例如,这些路线......
get('/foo'){ "foo" }
get('/bar'){ "#{spoof_request '/foo'} - bar" }
Run Code Online (Sandbox Code Playgroud)
...在使用Web浏览器请求"/ bar"时,应该会产生响应"foo - bar".
我的应用程序有一个表示错误条目的页面,其中包含有关该错误条目的大量详细信息:错误的版本是什么,它有多重要,哪些标记与之关联,错误分配给谁,等等.
用户可以交互地编辑该页面上的各个数据.使用我的AJAXFetch jQuery插件,JavaScript使用AJAX交换页面的只读部分(例如,将此bug分配给的人的名称),使用HTML部分表单来编辑该部分.用户提交表单,AJAX对该字段的静态版本发出新请求.
为了成为DRY,我想要创建页面的Haml视图使用与创建单个静态片段时AJAX完全相同的请求.例如:
#notifications.section
%h2 Email me if someone...
.section-body= spoof_request "/partial/notifications/#{@bug.id}"
Run Code Online (Sandbox Code Playgroud)
以下助手定义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
Run Code Online (Sandbox Code Playgroud)
然而,在Sinatra 1.2.3下,这不再适用.尽管将每个设置PATH_VARS为所需的URI,call( new_env )仍会导致Sinatra处理当前请求的路由,而不是指定的路径.(这导致无限递归,直到堆栈级别最终达到最低点.)
这个问题不同于在Sinatra内部调用Sinatra,因为对(旧)问题的接受答案不能保持用户的会话.
我使用的代码比Sinatra README 中的答案更复杂,但依赖于相同的机制。由于该版本中的错误,我的代码和自述文件中的答案都无法在 1.2.3 下工作。两者现在都在 1.2.6 下工作。
这是一个有效的简单助手的测试用例:
require 'sinatra'
helpers do
def local_get(url)
call(env.merge("PATH_INFO" => url)).last.join
end
end
get("/foo"){ "foo - #{local_get '/bar'}" }
get("/bar"){ "bar" }
Run Code Online (Sandbox Code Playgroud)
行动中:
require 'sinatra'
helpers do
def local_get(url)
call(env.merge("PATH_INFO" => url)).last.join
end
end
get("/foo"){ "foo - #{local_get '/bar'}" }
get("/bar"){ "bar" }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1767 次 |
| 最近记录: |