What is the [phone] representing?

Hey all,

trying to get a concept down. Or maybe the syntax.

Here is the code:

<p>Phones</p>

<p><% @person.phones.each { |phone| %>
<%= tag("input", "type" => "text", "id" =>
"phones[#{phone.id}][phone]", "name" => "phones[#{phone.id}][phone]",
"value" => phone.phone) %>

<%= phone.errors.on "phone" %><br/>
<% } %></p>

<p>Add new phone: (More phones can be added later)<br />
<input type="text" id="phones[new][phone]" name="phones[new][phone]"
value="">

</p>

What, exactly, is the [phone] in phones[#{phone.id][phone]? I know
phones is the db phones. I know phone id is the PK (and for
phones[new][phone]. What is phone though? Also, in phones[new][phone],
what is new creating/doing?

Similarly:

def update
     @person = Person.find(@params["person"]["id"])

     @person.attributes = @params["person"]

     if @person.save
       redirect_to :action => "show", :id => @person.id
     else
       render "person/edit"

     end
end

What is ["person"]? What is it referencing?

Thanks.

What, exactly, is the [phone] in phones[#{phone.id][phone]? I know
phones is the db phones. I know phone id is the PK (and for
phones[new][phone]. What is phone though? Also, in phones[new]
[phone],
what is new creating/doing?

This is Rails parameter naming converion

phones[#{phone.id}][phone] means that the corresponding input element
will (in the controller) be at params['phones']['25']['phone']
(assuming the id was 25).

The 'new' is presumably just a convention by whoever wrote this code
to indicate a new record.

I wrote some stuff up about this: http://www.spacevatican.org/2008/7/18/parametrised-to-the-max

Similarly:

def update
    @person = Person.find(@params["person"]["id"])

    @person.attributes = @params["person"]

    if @person.save
      redirect_to :action => "show", :id => @person.id
    else
      render "person/edit"

    end
end

What is ["person"]? What is it referencing?

Not sure what you're asking about. params is just a regular hash,
they're pulling out the value with key "person"

Ah, so basically foo[#{a}][b] is nothing more but Ruby conventional
syntax for
@params['foo']['#{a}][b]

As for my other question...I think I understand it now, but I want to be
sure and clarify something.

def update
     @person = Person.find(@params["person"]["id"])

     @person.attributes = @params["person"]

     if @person.save
       redirect_to :action => "show", :id => @person.id
     else
       render "person/edit"

     end
end

     @person = Person.find(@params["person"]["id"])

@params["person"]["id"] could be person[#{id}]. Of course, Person.find
is used because it will return a person record with the corresponding
id.

I am assuming that since Ruby can go from singular to plural, it is
smart enough to know that People.find wants a single record that can
only be found in the people db (as People represents multiple persons).

Frederick Cheung wrote:

Ah, so basically foo[#{a}][b] is nothing more but Ruby conventional
syntax for
@params['foo']['#{a}][b]

sort of. it's the parameter name that will make the parameters arrive
in that way.

I am assuming that since Ruby can go from singular to plural, it is
smart enough to know that People.find wants a single record that can
only be found in the people db (as People represents multiple
persons).

Yes - rails knows that the table backing the Person class is people

sort of. it's the parameter name that will make the parameters arrive
in that way.

Why does the param's name allow it to arrive in that way?

sort of. it's the parameter name that will make the parameters arrive
in that way.

Why does the param's name allow it to arrive in that way?

Because that's what the bit of code parsins query strings/form data is
looking for

Fred