Nester Resources, Routes and Class Inheritance

Ok here's a quicky... but a goody :slight_smile:

We have models Company, Reference and Applicant... and References and Applicants just inherit from Company, and are basically companies with the type field set to reference...

All companies can have a phone number associated with them, and phone number is a different model...

I'm having trouble using the form_for method with a company that happens to be an Applicant...

form_for( [ @company, @phone_number] )

tries to use the route applicant_phone_number however the only route that exists is company_phone_number, which is the one I want to use...

I tried to create a route by creating a map.resource :applicants, :has_many => phone_numbers

but there is no resource for Reference or Applicant only models, and thus it breaks down... I get errors.

Any ideas on the correct way to make this work?

Yup, using an array in form_for doesn't work in STI situations like you've got.

You'll have to do something like:

form_for :company_phone_number_path(@company, @phone_number)

Jeff

www.purpleworkshops.com

Ok so I tried your way, and I got an error;

compile error syntax error, unexpected '(', expecting kEND _erbout = ''; form_for :company_phone_number_path( [@company, @phone_number] ) do |f| ; _erbout.concat "\n"

So I did a little digging to see the syntax for it, and I came up with

<% form_for( [:company, @trade_item] ) do |f| %>

which seems to do the trick!

Quick Q, what does STI stand for, and what's the proper syntax for your "version" ?

Ok so I tried your way, and I got an error;

compile error syntax error, unexpected '(', expecting kEND _erbout = ''; form_for :company_phone_number_path( [@company, @phone_number] ) do |f| ; _erbout.concat "\n"

So I did a little digging to see the syntax for it, and I came up with

<% form_for( [:company, @trade_item] ) do |f| %>

which seems to do the trick!

Interesting! I should have known that: by using the symbol, instead of an @ variable, it just uses the name 'company' instead of trying to inspect the @company class name.

Quick Q, what does STI stand for, and what's the proper syntax for your "version" ?

Sorry: STI = "Single Table Inheritance", the Rails term for using the "type" column in your table to help Rails figure out the right subclass for the object corresponding to that row in the table.

I think you're getting the syntax error because you're still using the array form [@company, @phone]. I just use

company_phone_path(@company, @phone)

where @company and @phone are just passed as regular arguments.

Jeff