我建议你总是在终端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),其中@login在trainers_controller.rb的index方法中分配为@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)
您还可以将Login 和Trainer 的id 传递为帮助器的参数,具体取决于您在trainers_controller.rb 的show 方法中对您做的更好