2011-03-30 36 views
3

我有一个列表中的单词列表,并且我想处理对它们中的任何一个的请求(并以相同的方式响应)。Metaprogramming sinatra得到

@words = ["foo","bar"....etc] 

一个我想我能做到这一点是遍历列表,并有西纳特拉时启动每个字产生一个get指令的方式。

@words.each do |word| 
    get word do 
     # what to do 
    end 
end 

不起作用,但可能是某种方式。

这样做的另一种方式可能是响应get %r{/(.+)},然后在那里做一些处理,看它是否与列表中的任何内容相匹配并作出相应的响应,但我仍然有兴趣查看是否有办法做到这一点如上所述。

回答

4
  1. 你写的确实有效,只是做了很小的改动。例如:

    require 'sinatra' 
    %w[foo bar].each do |word| 
        get "/#{word}" do 
        "You said #{word}!" 
        end 
    end 
    
    $ curl http://localhost:4567/bar 
    You said bar!
  2. 而是一个包罗万象的正则表达式的路线,你可以动态地制作一个自定义的正则表达式匹配只有你想匹配的话:

    require 'sinatra' 
    words = %w[foo bar] 
    route_re = %r{^/(#{words.join '|'})$}i # case-insensitive 
    p route_re 
    #=> /^\/(foo|bar)$/i 
    
    get route_re do |name| 
        "You said #{name}!" 
    end 
    
    $ curl http://localhost:4567/FoO 
    You said FoO! 
    
    $ curl -I http://localhost:4567/jim 
    HTTP/1.1 404 Not Found 
    X-Cascade: pass 
    Content-Type: text/html;charset=utf-8 
    Content-Length: 413 
    Connection: keep-alive 
    Server: thin 1.2.7 codename No Hup
1

根据您的需要,这可能已足够:

get '/:word' do 
    # check if params[:word] is in your list 
    # and respond accordingly 
    if @words.include?(params[:word]) 
     "yeeah" 
    else 
     pass 
    end 
end 

但请记住,此路线匹配所有内容。

+1

那么你可以在else子句中添加通 – sirfilip 2011-04-24 23:14:50

+0

好主意@sirfilip我更改了代码 – daddz 2011-04-27 10:47:04