2011-11-04 51 views
3

我有一个需要使用内部机制的轨道使用将字符串转换为参数散列适合创建一个具有嵌套属性的对象构建。我无法找到请求导轨实际准备params []散列的生命周期中的哪个位置。手动创建参数散列轨

的字符串看起来像:

"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 

我知道我可以手动解析字符串,并将其转换成所需的哈希,但它似乎已经做它的框架存在,有点湿考虑代码。

回答

4

使用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) 
+0

谢谢你,我已经尝试过,并且parse_nested_query,但它不起作用 - 它确实创建一个散列,但将它传递给新的或创建方法的对象,它不会创建嵌套目的。嵌套对象的散列结构应该有一个attributes_for_ <嵌套模型>。 –

+0

我将考虑使用中间件来对此进行排序... –

+0

好的 - 我错过了一点,很容易忘记当与表单构建器一起使用的“accep_nested_attributes”使用命名约定命名参数时。这是我所做的事情的真正问题。我没有正确地命名变量。无论如何谢谢你的回复Zabba。 –

3

铁轨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)