Sinatra传递匿名阻止

时间:2015-05-08 22:15:45

标签: ruby sinatra

我是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" }

是否有可能做上面这样的事情?我正在设计一种拦截服务,可用于根据条件执行不同的操作

2 个答案:

答案 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