我需要有条件地param
在路线中设置选项。
没有条件很容易:
resources :foo, param: :uuid do
#...
end
我理想中想要的是以下几行(显然不起作用):
resources :foo, param: ->(req) { req.env['PATH_INFO'].match?(/bar/) ? :uuid : :id } do
#...
end
我需要有条件地param
在路线中设置选项。
没有条件很容易:
resources :foo, param: :uuid do
#...
end
我理想中想要的是以下几行(显然不起作用):
resources :foo, param: ->(req) { req.env['PATH_INFO'].match?(/bar/) ? :uuid : :id } do
#...
end
您可以编写一个更改参数的中间件:
class ParamTransformer
def initialize(app)
@app = app
end
def call(env)
if env['PATH_INFO'].match?(/bar/)
env.request.update_param('slug', env.request.params['id'])
end
@app.call(env)
end
end
# config/application.rb
config.middleware.use 'ParamTransformer'
如果您真的想有条件地在您的路线上执行此操作,您可以创建一个约束:
class ParamTransformerConstraint
def matches?(request)
if env['PATH_INFO'].match?(/bar/)
request.update_param('slug', request.params['id'])
end
true # lets everyone through
end
end
不过感觉真的很hacky。