手动创建参数哈希轨道

Pau*_*lay 3 ruby-on-rails nested-attributes

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

字符串看起来像:

"foo[butter]=fat&foo[cheese]=cheddar&bar[fork]=pointy&bar[knife]=sharp"
Run Code Online (Sandbox Code Playgroud)

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

def create
  decrypted = decrypt(params[:q])
  Object.create(magically_convert_to_param_hash(decrypted))
end
Run Code Online (Sandbox Code Playgroud)

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

gma*_*iar 10

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

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

  params = ActionController::Parameters.new(raw_parameters)
Run Code Online (Sandbox Code Playgroud)

那么你可以像这样要求和允许

  params.require(:foo).permit(:butter, :cheese)
  params.require(:bar).permit(:fork, :knife)
Run Code Online (Sandbox Code Playgroud)


Zab*_*bba 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)
Run Code Online (Sandbox Code Playgroud)

或者使用Rack :: Utils.parse_query:

params_hash = Rack::Utils.parse_query(params_in_url)
Run Code Online (Sandbox Code Playgroud)