gpt4 book ai didi

ruby - 在公共(public)基本路线之上构建路线?

转载 作者:数据小太阳 更新时间:2023-10-29 07:03:32 26 4
gpt4 key购买 nike

我有一个共同的基本路径;说:get/base 我需要执行基本身份验证并为该路径下的所有子调用工作。说:get/base/fooget/base/bar

查看http://www.sinatrarb.com/intro.html#Helpers建议我应该能够通过使用助手来做到这一点。我正在查看 pass 帮助程序并在文档中触发新路由下使用 call 。但是,我读到的另一个建议是使用正则表达式 IE %r{/base/?:(path)?} 或类似的动态路由。那么:

def '/base'
# do some funky basic auth stuff here
# to work with all request to this common
# base path?
pass
end

def %r{/base/?(path)?} do |path|
case path
when 'foo'
# do something.
when 'bar'
# do something else.
end

# some kind of redirection or template rendering here:
erb :template
end

有没有人处理过这种事情?我试图让它保持干燥。当然,我不确定给定的示例是否是保留参数的最佳示例。

最佳答案

有几种方法可以做到这一点(这些没有任何顺序,它们都很好):

带有 before block 和 helper 的命名空间

http://rubydoc.info/gems/sinatra-contrib/1.3.2/Sinatra/Namespace

require 'sinatra/namespace'

class App < Sinatra::Base
register Sinatra::Namespace

namespace "/base" do
helpers do # this helper is now namespaced too
def authenticate!
# funky auth stuff
# but no need for `pass`
end
end

before do
authenticate!
end

get "/anything" do
end

get "/you" do
end

get "/like/here" do
end
end

带条件的命名空间

require 'sinatra/namespace'

class App < Sinatra::Base
register Sinatra::Namespace

set(:auth) do |*roles| # <- notice the splat here
condition do
unless logged_in? && roles.any? {|role| current_user.in_role? role }
redirect "/login/", 303
end
end
end

namespace "/base", :auth => [:user] do
# routes…
end

namespace "/admin", :auth => [:admin] do
# routes…
end

助手和前置过滤器

helpers do
def authenticate!
# funky auth stuff
# but no need for `pass`
end
end

before '/base/*' do
authenticate!
end

映射的应用

class MyBase < Sinatra::Base
helpers do
def authenticate!
# funky auth stuff
# but no need for `pass`
end
end

before do
authenticate!
end

get "/" do
end
get "/another" do
end
end

# in rackup file

map "/" do
run App1
end
map "/base" do
# every route in MyBase will now be accessed by prepending "/base"
# e.g. "/base/" and "/base/another"
run MyBase
end
#…

我不确定是否需要使用 case 语句来 DRY up 路由。如果每条路线都做不同的事情,那么我会把它们分开写出来,因为它更清晰,而且您正在重复 Sinatra 在匹配路线方面所做的工作。

关于ruby - 在公共(public)基本路线之上构建路线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15695861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com