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 如下:
< for m 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、付费专栏及课程。

余额充值