我有一个控制器clients_controller
,带有相应的索引,显示,编辑,删除,新增&表格视图。有没有办法创建像clients/prospects.html.erb
这样的新视图,其行为方式与clients/index.html.erb
相同,除了在clients/prospects/
路由?
我试过这个:
match '/clients/prospects' => 'clients#prospects'
routes.rb
中的其他一些内容,但当然会收到错误“无法找到id为=的潜在客户”。
这里的目标基本上是拥有潜在客户视图和客户视图,只需将隐藏字段切换为1,它(在用户的脑海中)将潜在客户转变为客户端(它是类似CRM的应用程序)
答案 0 :(得分:7)
您需要做几件事。首先,您需要将自定义路线放在任何通用路线之前。否则Rails假定“前景”这个词是show动作的id。例如:
get '/clients/prospects' => 'clients#prospects' # or match for older Rails versions
resources :clients
您还需要在ClientsController中复制/粘贴索引方法并将其命名为prospect。例如:
class ClientsController < ApplicationController
def index
@clients = Client.where(prospect: false)
end
def prospects
@prospects = Client.where(prospect: true)
end
end
最后,您需要复制index.html.erb视图并将副本命名为prospects.html.erb。在上面的示例中,您必须使用@prospects实例变量。
答案 1 :(得分:0)
在客户端控制器命名的潜在客户中创建新操作。然后在routes.rb中定义一个收集路由,作为资源的完整方式。或者你直接使用匹配。
答案 2 :(得分:0)
您正在做的事情没有错(虽然我将match
更改为get
,否则POST和DELETE对该网址的请求也会呈现您的潜在客户视图。大概你有
resources :clients
?如果是这样,如果您只是移动在资源声明上方引用的行,那么您所拥有的内容可能会有效 - 问题是/clients/prospects
与show
资源的clients
路由匹配,因此如果首先定义那么那就是匹配的路线。
然而,有一种更惯用的方式来定义这条路线
resources :clients do
collection do
get :prospects
end
end
有关详情,请参阅Rails Routing documentation
另请参阅migu关于在正确路由网址后需要执行 else 的答案(尽管还有其他事情可以做 - 如果两个视图足够相似,则可以例如,重用视图模板。