Hi, I''m planning a new application and after all I''ve read a RESTful rails app seems to be perfect for the job. But since a few days I''m struggling with routing... here''s my simple test. If would be great if someone could enlighten me... Three models: Person <----> Employment <----> Company class Person < ActiveRecord::Base has_many :employments has_many :companies, :through => :employments end class Employment < ActiveRecord::Base belongs_to :company belongs_to :person end class Company < ActiveRecord::Base has_many :employments has_many :people, :through => :employments end I''ve created the models and generated all three controllers with the scaffold_resource generator. 1. I would like the following URLs to work correct: http://localhost:3000/companies http://localhost:3000/companies/2 http://localhost:3000/people This is quite simple. I just added two routes: map.resources :companies map.resources :people 2. Now I would like the following to work: http://localhost:3000/companies/1/people This should show me a list with all people assigned (via Employment) to company with ID=1. This route seem''s like a starting point: map.resources :companies do |company| company.resources :people end Now I think I must enhance the CompaniesController. Changing my controller to something like this... def index @companies = Person.find(params[:person_id]).companies end ... seems to work, but of course http://localhost:3000/companies stopped working. Do I really have to change my index method again to decide between "person_id is set, look for Person.find(:person_id).companies" and "no person_id, so do a Company.find(:all)"? What happens when my application is growing and there are many models connected with my Person-model? Isn''t there some of this rails-magic-glue that''s doing the dirty work? I also thought that calling something like http://localhost/companies/42/people/new would automagically create the association between the Company with ID 42 and the newly entered Person...? Regards, Timo --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi, looking at your models I''d say you need 2 more resources: employees and employers. NOTE: I am *not* saying you need 2 more models. I''m saying 2 more resources. See below: On 15-Mar-07, at 2:06 PM, Timo Springmann wrote:> > Hi, > > I''m planning a new application and after all I''ve read a RESTful > rails app > seems to be perfect for the job. But since a few days I''m > struggling with > routing... here''s my simple test. If would be great if someone could > enlighten me... > > Three models: Person <----> Employment <----> Company > > class Person < ActiveRecord::Base > has_many :employments > has_many :companies, :through => :employments > end > > class Employment < ActiveRecord::Base > belongs_to :company > belongs_to :person > end > > class Company < ActiveRecord::Base > has_many :employments > has_many :people, :through => :employments > end > > I''ve created the models and generated all three controllers with the > scaffold_resource generator. > > 1. I would like the following URLs to work correct: > > http://localhost:3000/companies > http://localhost:3000/companies/2 > http://localhost:3000/people > > This is quite simple. I just added two routes: > map.resources :companies > map.resources :people > > 2. Now I would like the following to work: > http://localhost:3000/companies/1/people > > This should show me a list with all people assigned (via > Employment) to > company with ID=1. > > This route seem''s like a starting point: > map.resources :companies do |company| > company.resources :people > end >map.resources :companies do |company| company.resources :employees end map.resources :people do |person| person.resources :employers end employees_controller and employers_controller can then deal with the logic of your Employment model according to their specific needs without resorting to torturous logic like "I''m the companies controller but if I have a person_id them I''m displaying a specific person''s company". And, of course, you can use shared partials to keep your views dry. HTH, Trevor> > Now I think I must enhance the CompaniesController. Changing my > controller to > something like this... > > def index > @companies = Person.find(params[:person_id]).companies > end > > ... seems to work, but of course http://localhost:3000/companies > stopped > working. > > Do I really have to change my index method again to decide between > "person_id > is set, look for Person.find(:person_id).companies" and "no > person_id, so do > a Company.find(:all)"? > > What happens when my application is growing and there are many models > connected with my Person-model? Isn''t there some of this rails- > magic-glue > that''s doing the dirty work? > > I also thought that calling something like > http://localhost/companies/42/people/new would automagically create > the > association between the Company with ID 42 and the newly entered > Person...? > > Regards, > Timo > >--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Timo, Maybe this will get your mind focused toward the correct solution: http://localhost:3000/employments/new Take a look at the following set of slides. Page down until you see a bright orange slide labeled "Constraints are liberating." Then read though the next few slides. http://www.loudthinking.com/lt-files/worldofresources.pdf On Mar 15, 5:06 pm, Timo Springmann <t.springm...-yM2StcZat7YdDX0dnZFiFbNAH6kLmebB@public.gmane.org> wrote:> Hi, > > I''m planning a new application and after all I''ve read a RESTful rails app > seems to be perfect for the job. But since a few days I''m struggling with > routing... here''s my simple test. If would be great if someone could > enlighten me... > > Three models: Person <----> Employment <----> Company > > class Person < ActiveRecord::Base > has_many :employments > has_many :companies, :through => :employments > end > > class Employment < ActiveRecord::Base > belongs_to :company > belongs_to :person > end > > class Company < ActiveRecord::Base > has_many :employments > has_many :people, :through => :employments > end > > I''ve created the models and generated all three controllers with the > scaffold_resource generator. > > 1. I would like the following URLs to work correct: > > http://localhost:3000/companieshttp://localhost:3000/companies/2http://localhost:3000/people > > This is quite simple. I just added two routes: > map.resources :companies > map.resources :people > > 2. Now I would like the following to work:http://localhost:3000/companies/1/people > > This should show me a list with all people assigned (via Employment) to > company with ID=1. > > This route seem''s like a starting point: > map.resources :companies do |company| > company.resources :people > end > > Now I think I must enhance the CompaniesController. Changing my controller to > something like this... > > def index > @companies = Person.find(params[:person_id]).companies > end > > ... seems to work, but of coursehttp://localhost:3000/companiesstopped > working. > > Do I really have to change my index method again to decide between "person_id > is set, look for Person.find(:person_id).companies" and "no person_id, so do > a Company.find(:all)"? > > What happens when my application is growing and there are many models > connected with my Person-model? Isn''t there some of this rails-magic-glue > that''s doing the dirty work? > > I also thought that calling something likehttp://localhost/companies/42/people/newwould automagically create the > association between the Company with ID 42 and the newly entered Person...? > > Regards, > Timo--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi,> looking at your models I''d say you need 2 more resources: employees > and employers.Well, after reading the rest of your post, this seems damn logical. Thanks for the enlightment. :-)> map.resources :companies do |company| > company.resources :employees > end > > map.resources :people do |person| > person.resources :employers > end > > employees_controller and employers_controller can then deal with the > logic of your Employment model according to their specific needs > without resorting to torturous logic like "I''m the companies > controller but if I have a person_id them I''m displaying a specific > person''s company". And, of course, you can use shared partials to > keep your views dry.I think this is the way to go, although I hoped for a little bit more magic... Regards, Timo --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---