2017-04-20 53 views
0

我需要在路由中有条件地设置param选项。如何在Rails路由中捕获请求?

没有条件很简单:

resources :foo, param: :uuid do 
    #... 
end 

我非常想为大意如下的东西(没有明显的工作):

resources :foo, param: ->(req) { req.env['PATH_INFO'].match?(/bar/) ? :uuid : :id } do 
    #... 
end 
+0

你想完成什么?只需要将参数键更改为'uuid'?我会坚持':id'并通过使用像friendly_id这样的特殊查找器来处理它。 – max

+0

@max我安装了friendly_id,但只有少数控制器需要使用'param::slug'。在其他控制器中,该资源应该使用默认的'param'保持不变... –

+0

您可以使用约束吗? '资源:foo,约束:lambda {| req | req.env ['PATH_INFO']。match?(/ bar /)}' – Iceman

回答

2

你可以写一个中间件的是改变了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 

虽然这感觉真的很黑。

+0

“使用':id'的路线正常化”的问题是,当涉及到'friendly_id'时,我不得不将代码改为超级。所以我想限制代码更改只是控制器/视图,我想使用':slug',并保持它在其他地方。 –

+0

好吧,然后只使用中间件。 – max

+0

嗯,我没有访问'请求'变量那里(它是未定义的) –