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