Как использовать Link_to и почему - PullRequest
0 голосов
/ 22 июня 2019

Я новичок в ruby ​​на рельсах, и ни один из ответов, которые я видел, не касался моей проблемы, и ни один вопрос не является достаточно конкретным для меня

Я пытаюсь использовать помощник <%= link_to %> нарельсы, но это всегда говорит

неопределенная локальная переменная или метод trainer_index

Для класса, в котором я создаю игру покемонов,

мои контроллеры, модели и представлениявыглядит примерно так:

├── app
│   ├── controllers
│   │   ├── login_controller.rb
│   │   └── trainer_controller.rb
│   ├── models
│   │   ├── login.rb
│   │   └── trainer.rb
│   └── views
│       ├── logins
│       │   ├── create.html.erb
│       │   ├── index.html.erb
│       │   ├── show.html.erb
│       │   ├── update.html.erb
│       └── trainers
│           ├── index.html.erb
│           ├── show.html.erb
│           ├── create.html.erb
│           ├── destroy.html.erb

# config / rout.rb

resources :login do
  resources :trainer
end

как мне отформатировать моего link_to помощника, чтобы связать кнопку в моем:

views/login/show

на мой:

views/trainers/index

и почему?

означает в link_to «имя», что-то_путь

ссылаюсь ли я на мой контроллер, мой вид или мою модель?

Ответы [ 2 ]

4 голосов
/ 22 июня 2019

Я бы посоветовал вам всегда запускать команду в терминале 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

1 голос
/ 22 июня 2019

Привет и добро пожаловать в переполнение стека! В Rails вы используете хелпер link_to вместо тега </a> из html. Но link_to также просто генерирует HTML-тег с правильными атрибутами. Используйте это так:

<%= link_to "Text on the link", path %>

Теперь, чтобы найти правильный путь (атрибут href ссылки). Вам нужно найти правильный префикс для ваших маршрутов. Есть команда терминала, которую вы можете использовать, чтобы выяснить это: rails routes запустите ее в своем терминале и посмотрите красивую таблицу ваших маршрутов, на какие действия контроллера они направлены и их префиксы.

Поскольку у вас есть вложенные маршруты, ваш префикс должен выглядеть примерно так: login_trainers для действия указателя # index. Теперь, почему мы используем ссылку на помощника. Это становится понятным, когда вы внимательно посмотрите на маршрут для указателя тренера: login/:login_id/trainers. Это означает, что в URL есть динамическая часть, представляющая идентификатор соответствующей записи. Затем link_to нужен идентификатор (или весь экземпляр) для создания правильного a-тега. Таким образом, вы можете построить link_to:

<%= link_to "All trainers", login_trainers_path(@login) %>

@login из контроллера.

Последний совет: почему вы вкладываете свои маршруты под логином? Вы сами заботитесь о входе в свое приложение? Вы должны взглянуть на камень разработки, это камень аутентификации и он очень крутой!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...