【问题标题】:How To Use Link_to and why如何使用 Link_to 以及为什么
【发布时间】:2019-06-22 04:40:04
【问题描述】:

我是 ruby​​ on rails 的新手,我看到的答案都没有解决我的问题,而且没有一个问题对我来说足够具体

我正在尝试在 rails 上使用 <%= link_to %>helper,但它总是说

未定义的局部变量或方法 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

为什么?

link_to "name", something_path 中的含义

我是在引用我的控制器、我的视图还是我的模型?

【问题讨论】:

  • 非常感谢大家!,你们所有的答案一起为我提供了我所需要的清晰度

标签: ruby-on-rails ruby


【解决方案1】:

我建议你总是在终端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(在这种情况下是 login 对象的 id 或对象本身,通常作为变量 @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),其中@logintrainers_controller.rbindex方法中分配为@login = Login.find(params[:login_id]@login = Login.find(params[:login_id]

如果您想显示特定的trainer,您应该查看 GET:

#       login_trainer GET    /login/:login_id/trainer/:id(.:format)      trainer#show

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

login_trainer_path(@login, @trainer)

您还可以将LoginTrainerid 传递为帮助器的参数,具体取决于您在trainers_controller.rbshow 方法中对您做的更好

【讨论】:

    【解决方案2】:

    您好,欢迎来到 Stack Overflow! 在 Rails 中,您使用 link_to 助手而不是 html 中的 </a> 标记。但是 link_to 也只是生成一个具有正确属性的 html a-tag。 像这样使用它:

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

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

    既然你有嵌套路由,你的前缀应该是这样的: login_trainers 用于 trainer#index 操作。现在我们为什么要使用 helper 的链接。当您仔细查看教练索引的路线时,就会变得很清楚: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,非常酷!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-17
      • 2012-03-06
      • 2018-03-12
      • 2011-01-22
      • 2013-06-13
      • 2021-01-24
      • 2013-01-05
      相关资源
      最近更新 更多