Я использую наследуемые_ресурсы, чтобы СУШИТЬ свои контроллеры, но не могу понять, как заставить определенный контроллер работать правильно. В моей модели User has_one Person
. Я хочу, чтобы он был произвольно вложенным, вел себя как одиночный, когда вложенный, и как не одиночный, когда не вложенный. Другими словами, я хочу иметь возможность перечислить всех известных людей (/ people), получить человека № 5 (/ person / 5) и получить единственного пользователя 10-го пользователя (/ user / 10 / person). Следующее в маршрутах .rb:
resources :users
resource :person
end
resources :people
... устанавливает маршруты, как я ожидаю:
user_person POST /users/:user_id/person(.:format) people#create
new_user_person GET /users/:user_id/person/new(.:format) people#new
edit_user_person GET /users/:user_id/person/edit(.:format) people#edit
GET /users/:user_id/person(.:format) people#show
PUT /users/:user_id/person(.:format) people#update
DELETE /users/:user_id/person(.:format) people#destroy
people GET /people(.:format) people#index
POST /people(.:format) people#create
new_person GET /people/new(.:format) people#new
edit_person GET /people/:id/edit(.:format) people#edit
person GET /people/:id(.:format) people#show
PUT /people/:id(.:format) people#update
DELETE /people/:id(.:format) people#destroy
... так здорово. Теперь, если в PeopleController, я использую:
belongs_to :user, :optional => true
... тогда не вложенные URL-адреса / people работают, а вложенные / users /: user_id / person urls не: undefined method 'people'
Если вместо этого в PeopleController я использую:
belongs_to :user, :optional => true, :singleton => true
... тогда работают вложенные / users /: user_id / person url, но не вложенные / people url не работают, потому что он обрабатывается как одиночный, даже если не вложенный: undefined method 'person'
Сводка: существует ли способ, чтобы атрибут объектатекапервный обрабатывал ресурс как одноэлементный при доступе по вложенному маршруту, а не как одноэлементный при доступе по не вложенному маршруту?