Разница между ресурсами и контроллерами
когда я делаю
rails g model user name:string
rails g controller users index create new destroy show
и отредактируйте config/routes.rb, чтобы добавить:
resource :users
Объединяет exec rake routes дает:
users POST /users(.:format) {:action=>"create", :controller=>"users"}
new_users GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_users GET /users/edit(.:format) {:action=>"edit", :controller=>"users"}
GET /users(.:format) {:action=>"show", :controller=>"users"}
PUT /users(.:format) {:action=>"update", :controller=>"users"}
DELETE /users(.:format) {:action=>"destroy", :controller=>"users"}
однако, когда я делаю
rails g resource users name:string
(который автоматически добавляет ресурсы: users to config/routes.rb) трассировка рейка
Я получаю
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
Итак, мой вопрос:
когда я создаю контроллер, как я могу получить правильные вспомогательные методы для создания
link_to 'Destroy', instance,: method = > : delete
работать?
Так как в настоящее время он дает ошибку, то user_path не определен.
Ответы
Ответ 1
Вы должны позвонить
rails g controller user index create new destroy show
вместо
rails g controller users index create new destroy show
чтобы получить resources :users
, чтобы дать вам нужные помощники.
Последнее приводит к тому, что Rails предполагает, что users
является особым объектом и что resources :users
должен создавать то, что называется особым ресурсом:
http://guides.rubyonrails.org/routing.html#singular-resources
user_path
- undefined, тогда как users_path
определяется.
Ответ 2
Когда вы используете rails g controller
и указываете имена методов, генератор только отображает определенные маршруты в файл маршрутов. rails g resource
предполагает, что вы хотите использовать всю функциональность ресурса и отобразите resources
.
Чтобы исправить это, просто зайдите в свой файл маршрутов и замените конкретные сопоставления вызовом ресурсов.
resources :users
Ответ 3
Я действительно хотел создать рабочий (с правильным контроллером delete/show paths) для существующей модели (как описано в вопросе), но просто добавить "resource: x" и генерировать контроллер было недостаточно.
В итоге я использовал генератор scaffold_controller. Он не создает никаких миграций или моделей, но он генерирует ресурс с представлениями, а команда rake paths
показывает правильные пути для удаления и показывать, чтобы работать.
Ответ 4
В консоли можно запускать следующие команды:
$rails g model user name:string
$rails g scaffold_controller User
И добавьте эту строку кода в файл routes.rb:
resources :users