如何在Rails路由中捕获请求?

时间:2017-04-20 13:01:15

标签: ruby-on-rails routes ruby-on-rails-5 actiondispatch

我需要在路线中有条件地设置rename()选项。

没有条件就很容易:

param

理想情况下我想要的是以下几点(显然不起作用):

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

1 个答案:

答案 0 :(得分:2)

您可以编写一个改变参数的中间件:

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

虽然感觉真的太烂了。