手动创建参数哈希轨道

时间:2011-11-04 12:09:42

标签: ruby-on-rails nested-attributes

我需要使用rails使用的内部机制将字符串转换为适合创建具有嵌套属性的对象构建的参数哈希。我无法找到请求rails的生命周期中的哪个实际上准备了params [] hash。

字符串如下:

"foo[butter]=fat&foo[cheese]=cheddar&bar[fork]=pointy&bar[knife]=sharp"

为了给出一些上下文,上面的字符串是通过对我的应用程序的API调用从加密的请求中提取的。这就是为什么它一旦解密就会以这种形式出现。

def create
  decrypted = decrypt(params[:q])
  Object.create(magically_convert_to_param_hash(decrypted))
end

我意识到我可以手动解析这个字符串并将其转换为所需的哈希值,但考虑到代码存在于已经存在的框架中,它似乎有点潮湿。

2 个答案:

答案 0 :(得分:5)

像这样使用CGI::parse

params_in_url = "foo[butter]=fat&foo[cheese]=cheddar&bar[fork]=pointy&bar[knife]=sharp"
params_hash = CGI::parse(params_in_url)

或使用Rack::Utils.parse_query

params_hash = Rack::Utils.parse_query(params_in_url)

答案 1 :(得分:3)

从Rails 4开始,你也可以这样做:

  raw_parameters = { 
    :foo => {
      :butter => "fat", 
      :cheese => "cheddar", 
    },
    :bar => {
      :fork => "pointy",
      :knife => "sharp",
    }
  }

  params = ActionController::Parameters.new(raw_parameters)

然后你可以这样要求和允许

  params.require(:foo).permit(:butter, :cheese)
  params.require(:bar).permit(:fork, :knife)