【问题标题】:Rails: How Rails creates params hash from the input data submitted from formRails:Rails 如何根据表单提交的输入数据创建参数哈希
【发布时间】:2021-07-08 12:41:31
【问题描述】:

我正在尝试提交。下面是我的表格。当我提交此表单时,rails 生成参数哈希为{"authenticity_token"=>"[FILTERED]", "users"=>[{"id"=>"a", "name"=>"b"}, {"id"=>"c", "name"=>"d"}], "commit"=>"Save "}

<%= form_with do |form| %>
    <%= form.text_field "users[][][][][id]" %>
    <%= form.text_field "users[][][][][name]" %>
    <%= form.text_field "users[][id]" %>
    <%= form.text_field "users[][name]" %>              
    <%= form.submit %>
<% end %>

但是当我通过反转文本字段元素的顺序来提交相同的表单时,如下所示,为什么 rails 将参数生成为{"authenticity_token"=&gt;"[FILTERED]", "users"=&gt;[{"id"=&gt;"c", "name"=&gt;"d"}], "commit"=&gt;"Save "} ??

<%= form_with do |form| %>
    <%= form.text_field "users[][id]" %>
    <%= form.text_field "users[][name]" %>  
    <%= form.text_field "users[][][][][id]" %>
    <%= form.text_field "users[][][][][name]" %>            
    <%= form.submit %>
<% end %>

为什么 rails 不考虑提供给元素的输入值 a and b &lt;%= form.text_field "users[][id]" %&gt; &lt;%= form.text_field "users[][name]" %&gt;分别在上面的形式形成hash params时??

【问题讨论】:

    标签: ruby-on-rails parameters


    【解决方案1】:

    按照这些步骤来了解 rake 如何解析参数。

    • Opne irb
    • 输入以下代码
    require "rack"
    
    query_string = "users[][][][][id]=a&users[][][][][name]=b&users[][id]=c&users[][name]=d"
    Rack::Utils.parse_nested_query(query_string)
    => {"users"=>[{"id"=>"a", "name"=>"b"}, {"id"=>"c", "name"=>"d"}]}
    
    query_string = "users[][id]=a&users[][name]=b&users[][][][][id]=c&users[][][][][name]=d"
    Rack::Utils.parse_nested_query(query_string)
    => {"users"=>[{"id"=>"c", "name"=>"d"}]}
    

    Rails 在查询字符串中从左到右读取查询参数,并在每次看到重复属性时创建一个新对象。

    此外,当字段名称以空方括号结尾时,参数将被视为空数组,并附加值。

    请参阅此博客 Rails Parameters Parsing and the Case of Parameters Corruption 以彻底了解此概念。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2019-09-29
      • 1970-01-01
      • 2019-06-20
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多