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: Parametrised to the max - Space Vatican

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