Я бы посоветовал вам всегда запускать команду в терминале rails routes
(или rake routes
) и взглянуть на Rails маршрутизация , понимая также глаголы CRUD и действия .
rails routes
принимает также аргумент -c
(контроллер), чтобы вы могли показать маршруты к контроллеру.
Пока вы читаете руководство, запустите команду для вашего приложения, начиная с верхнего уровня:
rails routes -c login
, оно выведет:
# Prefix Verb URI Pattern Controller#Action
# login_index GET /login(.:format) login#index
# POST /login(.:format) login#create
# new_login GET /login/new(.:format) login#new
# edit_login GET /login/:id/edit(.:format) login#edit
# login GET /login/:id(.:format) login#show
# PATCH /login/:id(.:format) login#update
# PUT /login/:id(.:format) login#update
# DELETE /login/:id(.:format) login#destroy
- В первом столбце у вас есть префиксдля использования в качестве path или url helper в
link_to
. - Во втором столбце показан соответствующий глагол CRUD.
- Столбец URI показывает, как форматируется строка URI: вы видите, что есть: id, который должен быть идентификатором ресурса (в данном случае
id
из login
объекта или самого объекта, часто передаваемого как переменная @login
). - В последнем столбце показан соответствующий контроллер и метод в контроллере.
Например, # login GET /login/:id(.:format) login#show
означает:
- Существует файл контроллера logins_controller.rb
- Контроллер определяет метод show:
def show; end
- Существует папка представления `app \ views \ logins \ show.html.erb
- Вы можете перейти на страницу по адресу
login\123
который показывает Login
объект с id = 123
- В контроллере параметр
:id
доступно как params [: id] и имеет значение 123
Для вложенного регистра
trainer
, запустите
rails routes -c trainer
:
# Prefix Verb URI Pattern Controller#Action
# login_trainer_index GET /login/:login_id/trainer(.:format) trainer#index
# POST /login/:login_id/trainer(.:format) trainer#create
# new_login_trainer GET /login/:login_id/trainer/new(.:format) trainer#new
# edit_login_trainer GET /login/:login_id/trainer/:id/edit(.:format) trainer#edit
# login_trainer GET /login/:login_id/trainer/:id(.:format) trainer#show
# PATCH /login/:login_id/trainer/:id(.:format) trainer#update
# PUT /login/:login_id/trainer/:id(.:format) trainer#update
# DELETE /login/:login_id/trainer/:id(.:format) trainer#destroy
Историято же самое, но теперь у вас есть еще один параметр:
:id
(params[:id]
), который ссылается на объект контроллера, в данном случае trainer
,поэтому он может ссылаться на модель Trainer
. :login_id
(params[:login_id]
), которая относится к объекту login
, так что вы можете использовать для поиска записи всвязанная модель: @login = Login.find(params[:login_id])
.
Из таблицы видно, что, если вы хотите показать все тренеры:
# login_trainer_index GET /login/:login_id/trainer(.:format) trainer#index
Ваш помощник по пути -
login_trainer_index_path(@login.login_id)
или просто login_trainer_index_path(@login)
, где @login
назначается в index
методе trainers_controller.rb
как @login = Login.find(params[:login_id]
Если вы хотите показать конкретный trainer
, вы должны посмотреть в GET:
# login_trainer GET /login/:login_id/trainer/:id(.:format) trainer#show
, поэтому вспомогательный путь аналогичен (обратите внимание на два параметра):
login_trainer_path(@login, @trainer)
Вы также можете передать id
из Login
и Trainer
в качестве аргументов дляпомощник, в зависимости от того, что вам лучше сделать, чтобыв show
метод trainers_controller.rb