我需要在路由中有条件地设置param
选项。如何在Rails路由中捕获请求?
没有条件很简单:
resources :foo, param: :uuid do
#...
end
我非常想为大意如下的东西(没有明显的工作):
resources :foo, param: ->(req) { req.env['PATH_INFO'].match?(/bar/) ? :uuid : :id } do
#...
end
我需要在路由中有条件地设置param
选项。如何在Rails路由中捕获请求?
没有条件很简单:
resources :foo, param: :uuid do
#...
end
我非常想为大意如下的东西(没有明显的工作):
resources :foo, param: ->(req) { req.env['PATH_INFO'].match?(/bar/) ? :uuid : :id } do
#...
end
你可以写一个中间件的是改变了PARAMS :
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'
如果你真的想有条件地在你的路线上做,你会ld创建一个约束:
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
虽然这感觉真的很黑。
“使用':id'的路线正常化”的问题是,当涉及到'friendly_id'时,我不得不将代码改为超级。所以我想限制代码更改只是控制器/视图,我想使用':slug',并保持它在其他地方。 –
好吧,然后只使用中间件。 – max
嗯,我没有访问'请求'变量那里(它是未定义的) –
你想完成什么?只需要将参数键更改为'uuid'?我会坚持':id'并通过使用像friendly_id这样的特殊查找器来处理它。 – max
@max我安装了friendly_id,但只有少数控制器需要使用'param::slug'。在其他控制器中,该资源应该使用默认的'param'保持不变... –
您可以使用约束吗? '资源:foo,约束:lambda {| req | req.env ['PATH_INFO']。match?(/ bar /)}' – Iceman