如何使用Link_to以及为什么

时间:2019-06-22 04:40:04

标签: ruby-on-rails 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 / routes.rb

resources :login do
  resources :trainer
end

我该如何格式化link_to助手来链接我的按钮:

views/login/show

给我:

views/trainers/index

为什么?

的意思是链接到“名称”,某事路径

我要引用控制器,视图或模型吗?

2 个答案:

答案 0 :(得分:4)

我建议您始终在终端rails routes(或rake routes)中运行命令,并看看Rails routing,也了解CRUD verbs and actions

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
  • 第一列的前缀是link_to中的path or url helper
  • 第二列显示相应的CRUD动词。
  • URI列显示URI字符串的格式:您会发现有一个:id,它应该是资源的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,因此可以引用模型{{1} }。
  • Trainer :login_id),它引用了params[:login_id]对象,因此您可以用来在相关模型中查找记录:{{1} }。

从表中可以看到是否要显示所有教练:

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)的{​​{1}}方法中被分配为@login

如果要显示特定的index,则应查看GET:

trainers_controller.rb

所以助手路径类似于(请注意两个参数):

@login = Login.find(params[:login_id]

您还可以将trainer# login_trainer GET /login/:login_id/trainer/:id(.:format) trainer#show 的{​​{1}}传递为帮助程序的参数,这取决于您在{{1 }}

答案 1 :(得分:1)

嗨,欢迎来到Stack溢出! 在Rails中,您可以使用link_to帮助程序,而不是html中的</a>标签。但是link_to也只会生成具有正确属性的html a-tag。 像这样使用它:

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

现在为了找到正确的路径(链接的href属性)。您需要为路线找到正确的前缀。您可以使用一个终端命令来查找它:rails routes在终端中运行它,并查看一个漂亮的路由表,它们被路由到的控制器操作及其前缀。

由于您已嵌套路由,因此前缀应类似于: login_trainers用于Trainer#index动作。现在,为什么我们使用链接到帮助器。当您仔细查看培训师索引的路径:login/:login_id/trainers时,很明显。意思是,URL中有一个动态部分,代表相应记录的ID。 然后,link_to需要一个ID(或整个实例)才能构建正确的a-tag。 因此,您可以构建link_to:

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

@login来自控制器。

最后一条提示:为什么在登录时嵌套路由?您自己负责登录应用吗?您应该看看devise gem,它是一个认证gem,非常酷!