我是Sinatra的新手,我正在尝试实施以下内容:
使用get方法的REST服务,可以提供其操作块。类似的东西:
class C1
get '/something' do
<some action to be provided later>
end
post '/something' do
<some action to be provided later>
end
end
C1.new
C1.get_block = { "Hello from get" }
C1.post_block = { "Hello from post" }
是否有可能做上面这样的事情?我正在设计一种拦截服务,可用于根据条件执行不同的操作
答案 0 :(得分:0)
以下应该可以解决问题。我添加了数组,因此您可以注册应在GET / POST请求时执行的多个块。
class C1
@@get_blocks = []
@@post_blocks = []
def register_get(block)
@@get_blocks << block
end
def register_post(block)
@@post_blocks << block
end
get '/something' do
@@get_blocks.each do |block|
block.call(params)
end
end
post '/something' do
@@post_blocks.each do |block|
block.call(params)
end
end
end
C1.new
C1.register_get { |params| "Hello from get" }
C1.register_post { |params| "Hello from post" }
答案 1 :(得分:0)
我认为@MartinKonecny使用一种非常好的动态和有效的方法回答了这个问题...
...但请允许我建议一种不同的方法,假设代码本身是静态的,并且它是根据一组条件激活的。
我知道使用the Plezi framework您可以为同一路线交替使用控制器,这样如果一个控制器没有回应请求,则会测试下一个请求。
我相信Sinatra可以以相同的方式使用,因此当第一条路线失败时,会尝试第二条路线。
使用the Plezi framework对概念(不是实际应用代码)的简短演示将如下所示:
require 'plezi'
listen
class C1
def index
"Controller 1 answers"
end
def hello
false
end
end
class C2
def show
"Controller 2 shows your request for: #{params[:id]}"
end
def hello
'Hello World!'
end
end
route '/(:id)', C1
route '/(:id)', C2
exit # exit the terminal to test this code.
这样,对于路径localhost:3000/,C1
类会回答。但是,C1
的路由未通过路径localhost:3000/1的剩余请求,因此C2
的路由会回复该请求,尝试使用id==1
显示对象。
访问localhost:3000/hello路由时很容易看到 - 第一条路线发生故障,然后尝试第二条路线。
如果您不需要动态定义块,也许这种方法 - 我认为也可以在Sinatra中使用 - 将更容易编码和维护。
如果使用Sinatra无法使用,您可以使用&#34;路由&#34;来模仿这种方法。 class作为Sinatra应用程序的控制器。
另一种方法是在case
语句中指定条件,根据每种情况调用不同的方法。
class C1
get '/something' do
case
when true # condition
# do something
when true # condition
# do something
when true # condition
# do something
when true # condition
# do something
else
# do something
end
end
end