【问题标题】:Manually creating parameter hash rails手动创建参数哈希轨道
【发布时间】:2011-11-04 12:09:42
【问题描述】:

我需要使用 rails 使用的内部机制将字符串转换为适合创建具有嵌套属性的对象构建的参数散列。我找不到请求 rails 在生命周期中实际准备 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

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

【问题讨论】:

    标签: ruby-on-rails nested-attributes


    【解决方案1】:

    从 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)
    

    【讨论】:

      【解决方案2】:

      像这样使用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)
      

      【讨论】:

      • 谢谢你,我已经试过了, parse_nested_query 也试过了,但它不起作用 - 它确实创建了一个哈希,但将它传递给一个对象的 new 或 create 方法,它不会t 创建嵌套对象。嵌套对象的哈希结构中应该有一个 attributes_for_
      • 好吧——我没抓住重点,很容易忘记“accepts_nested_attributes”与表单构建器一起使用时使用命名约定来命名参数......这是真正的问题与我正在做的事情。我没有正确命名变量。无论如何感谢您的回复 Zabba。
      • 太棒了!我很好奇,有效的变量命名是什么?你能在评论中展示一个简短的例子吗?谢谢!
      • 我取消了嵌套参数,因为我最终不需要它。但是,如果您检查发布到嵌套模型的表单,您会看到嵌套属性被命名为:nested_attributes_for_[]
      猜你喜欢
      • 2022-01-16
      • 2021-04-03
      • 2012-06-29
      • 2013-12-20
      • 1970-01-01
      • 2011-04-20
      • 2018-01-23
      • 2017-01-03
      • 1970-01-01
      相关资源
      最近更新 更多