Rails 3 has_one маршрутизация - PullRequest
11 голосов
/ 27 июля 2010

У меня есть два класса:

class User < ActiveRecord::Base
  :has_one :foo
end

class Foo < ActiveRecord::Base
  :belongs_to :user 
end

Foo является необязательным.

Я создал следующую маршрутизацию:

resources :users do
  resources :foo
end

Что приводит к следующим маршрутам:

GET    /users/:user_id/foo(.:format)              {:controller=>"foos", :action=>"index"}
user_foos POST   /users/:user_id/foo(.:format)              {:controller=>"foos", :action=>"create"}
new_user_foo GET    /users/:user_id/foo/new(.:format)          {:controller=>"foos", :action=>"new"}
GET    /users/:user_id/foo/:id(.:format)          {:controller=>"foos", :action=>"show"}
PUT    /users/:user_id/foo/:id(.:format)          {:controller=>"foos", :action=>"update"}
user_foo DELETE /users/:user_id/foo/:id(.:format)          {:controller=>"foos", :action=>"destroy"}
edit_user_foo GET    /users/:user_id/foo/:id/edit(.:format)     {:controller=>"foos", :action=>"edit"}

Вопросы:

  1. Похоже, что действия Index и Show являются избыточными. Один из них должен быть удален? Если да, то какой?
  2. Параметр: id в действии Show кажется ненужным, поскольку user_id является внешним ключом в таблице foos, и для каждого пользователя существует только один foo. Я ошибаюсь?
  3. Я бы хотел, чтобы у меня был изящный способ перейти к Новому действию, если нет foo. Одним из вариантов было бы проверить @ user.foo.nil? в действии Show или Index FooController, затем перенаправьте на действие New. Есть ли лучший способ?

Спасибо за ваше время.

Ответы [ 2 ]

27 голосов
/ 02 августа 2010

Если ваша модель имеет ассоциацию has_one, попробуйте настроить маршрут с помощью resource :foo (обратите внимание на имя метода в единственном числе «ресурс», а не «ресурсы»). Это создаст маршрут для одноэлементного ресурса (который, например, не имеет действия индекса, а действия члена не имеют параметра id, поскольку существует только один член). См. Также http://apidock.com/rails/ActionController/Resources/resource (документация 2.3, но также относится и к 3.0).

2 голосов
/ 30 августа 2011

Я могу понять, почему Крэйг пропустил это на самом деле.Это такая тонкая разница, что даже не приходила мне в голову.Единственное, что меня поразило, это то, что мои именованные маршруты для синглтон-ресурса имеют странное индексное имя: user_foo_index вместо user_foos.

Это действительно умный вывод из-за отсутствия множественного числа со стороныof Rails.

Предупреждение: В следующих примерах поверхностное вложение выполняется следующим образом:

resources :cats, shallow: true do
  resources :noms
end

Или что:

resources :cats do
  shallow do
    resources :noms
  end
end

В любом случае, вернемся к делу, если вы настроите особый ресурс - например, address вместо articles - и вы увидите что-то вроде этого:

user_address_index GET | POST
  new_user_address GET
      edit_address GET
           address GET | PUT | DELETE

Тогда, как справедливо указал АндреасВы, вероятно, неправильно объявили это в своих маршрутах:

resources :users do
  resources :address
end

И если вы измените это на:

resources :users do
  resource :address
end

У вас все должно быть в порядке, и вы увидите что-то подобное, если выpunch rake routes в вашем приглашении:

     user_address POST | GET | PUT | DELETE
 new_user_address GET
edit_user_address GET

Примечание: я знаю, что вывод маршрутов граблей не выглядит точно так (это намного более многословно), я просто упрощаю радифокус.

Надеюсь, что помогает.

...