我正在为我的Rails应用程序编写一个中间件,我正在做一些用户所做的历史操作。从请求中,我可以获得路径和方法,所以我认为这应该是映射它并获得该组合调用的方法的一种方法。
这是迄今为止的中间件:
class AccountabilityMiddleware
def initialize(app)
@app = app
end
def call(env)
dup._call env
end
def _call(env)
@status, @headers, @response = @app.call(env)
req = Rack::Request.new(env)
if !req.get? && req.path.starts_with?('/admin') && !req.path.starts_with?('/admin/login')
Accountability.create!(
user: env['warden'].user,
url: req.path,
method: req.request_method,
params: req.params,
method_name: ???????????????
response_status: @status,
response: @response.body,
)
end
[@status, @headers, @response]
end
end
例如,对于路径/admin/my_model
和方法POST
,我想得到"new_admin_my_model"
——一个已经在项目中定义的方法(由ActiveAdmin(
我同意@Konstantin的观点,这可能最好留给Rails路由器。
但是,如果您知道所有选项,那么使用字符串中的信息来构造新字符串并不太难。
只是吐口水,这是未经测试的
method_constructor = '_admin_'
# just an example of some logic
pre =
case req.request_method
when POST
'new'
when GET
'show'
# and so on
end
method_constructor.prepend pre
method_constructor.append req.path.gsub('/admin/', '')
# method_constructor will now be a string like 'new_admin_my_model'
这个逻辑显然需要比单独考虑request_method
更复杂,您可能需要像Rails一样映射。