Params详解(二)

1.正常命名为嵌套hash

<input id="person_name" name="person[name]" type="text" value="Henry"/>

得到的params为:

{'person' => {'name' => 'Henry'}}

2.[]代表数组

<input name="person[phone_number][]" type="text"/>
<input name="person[phone_number][]" type="text"/>
<input name="person[phone_number][]" type="text"/

得到的params[:person][:phone_number]是一个数组

{"person" => {"phone_number" => []}}


健壮参数提交的时候用这样:

    def person_params
      params.require(:person).permit(
        phone_number: []
      )
    end


3.数组中嵌套hash


  <input type="hidden" name="subject[body_data][][origin_url]" value="<%= f[:origin_url] %>"></input>
   <input type="hidden" name="subject[body_data][][medium_url]" value="<%= f[:medium_url] %>"></input>
   <input type="hidden" name="subject[body_data][][width]" value="<%= f[:width] %>"></input>
   <input type="hidden" name="subject[body_data][][height]" value="<%= f[:height] %>"></input>

   <input type="hidden" name="subject[body_data][][origin_url]" value="<%= f[:origin_url] %>"></input>
   <input type="hidden" name="subject[body_data][][medium_url]" value="<%= f[:medium_url] %>"></input>
   <input type="hidden" name="subject[body_data][][width]" value="<%= f[:width] %>"></input>
   <input type="hidden" name="subject[body_data][][height]" value="<%= f[:height] %>"></input>


得到的 params[:subject][:body_data] 值是一个由 Hash 组成的数组,Hash 中的键包括 origin_urlmedium_url ,height和width。如果 Rails 发现输入框的 origin(或者四个属性中任意一个) 属性值已经存在于当前 Hash 中,就会新建一个 Hash。


得到params是这样的:

{"subject" => {"body_data" => [{origin_url => XXX, medium_url => XXX, height => XXX, width => XXX}, {origin_url => XXX, medium_url => XXX, height => XXX, width => XXX},  {origin_url => XXX, medium_url => XXX, height => XXX, width => XXX} ] } }


健壮参数提交的时候用这样:

  private
    def subject_params
      params.require(:subject).permit(
        body_data: [:content, :photo, :origin_url, :medium_url, :width, :height]
      )
 end


4.fields_for方法的index参数


<%= form_for @person do |person_form| %>
  <%= person_form.text_field :name %>
  <% @person.addresses.each do |address| %>
    <%= person_form.fields_for address, index: address.id do |address_form|%>
      <%= address_form.text_field :city %>
    <% end %>
  <% end %>
<% end %>


假设这个人有两个地址,ID 分别为 23 和 45。那么上述代码生成的 HTML 如下:
<form accept-charset="UTF-8" action="/people/1" class="edit_person" id="edit_person_1" method="post">
  <input id="person_name" name="person[name]" type="text" />
  <input id="person_address_23_city" name="person[address][23][city]" type="text" />
  <input id="person_address_45_city" name="person[address][45][city]" type="text" />
</form>

得到的 params Hash 如下:
{'person' => {'name' => 'Bob', 'address' => {'23' => {'city' => 'Paris'}, '45' => {'city' => 'London'}}}}
Rails 之所以知道这些输入框中的值是 person Hash 的一部分,是因为我们在第一个表单构造器上调用了 fields_for 方法。指定 :index 选项的目的是告诉 Rails,其中的输入框 name 属性值不是 person[address][city],而要在 address 和 city 索引之间插入 :index 选项对应的值(放入方括号中)。这么做很有用,因为便于分辨要修改的 Address 记录是哪个。:index 选项的值可以是具有其他意义的数字、字符串,甚至是 nil(此时会新建一个数组参数)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值