ActionController :: Base.param_parsers替代方案

时间:2012-04-13 21:24:53

标签: ruby-on-rails

我发现有几个网站指向使用以下代码添加对自定义参数格式的支持:

ActionController::Base.param_parsers[Mime::PLIST] = lambda do |body|
  str = StringIO.new(body)
  plist = CFPropertyList::List.new({:data => str.string})
  CFPropertyList.native_types(plist.value)
end

这里的这个是针对Apple plist格式的,这是我想要做的。但是,使用 Rails 3.2.1 ,开发服务器将无法启动,表示param_parsers未定义。我不能找到任何关于它被弃用或任何替代使用的文档,只是它确实包含在2.x文档而不是3.x文档中。

在Rails 3中还有其他方法可以支持POST和PUT请求中的自定义参数格式吗?

1 个答案:

答案 0 :(得分:1)

params解析移动到Rack中间件。现在是part of ActionDispatch

要注册新的解析器,您可以重新声明中间件的使用,如下所示:

MyRailsApp::Application.config.middleware.delete "ActionDispatch::ParamsParser"
MyRailsApp::Application.config.middleware.use(ActionDispatch::ParamsParser, {
  Mime::PLIST => lambda do |body|
    str = StringIO.new(body)
    plist = CFPropertyList::List.new({:data => str.string})
    CFPropertyList.native_types(plist.value)
  end
})

或者您可以更改包含默认解析器的常量

ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime::PLIST] = lambda do |body|
  str = StringIO.new(body)
  plist = CFPropertyList::List.new({:data => str.string})
  CFPropertyList.native_types(plist.value)
end

第一个变种可能是最干净的。但是你需要知道,最后一个替换中间件声明的人会在那里获胜。