我是红宝石新手,我没有看到任何答案可以解决我的问题,而且没有一个问题对我来说足够具体
我正在尝试在导轨上使用<%= 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
为什么?
的意思是链接到“名称”,某事路径
我要引用控制器,视图或模型吗?
答案 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。id
对象的login
或对象本身,通常作为变量@login
传递。例如# login GET /login/:id(.:format) login#show
的意思是:
def show; end
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,非常酷!