在Rails中向控制器添加新视图

时间:2013-12-04 18:53:07

标签: ruby-on-rails ruby-on-rails-3 routes

我有一个控制器clients_controller,带有相应的索引,显示,编辑,删除,新增&表格视图。有没有办法创建像clients/prospects.html.erb这样的新视图,其行为方式与clients/index.html.erb相同,除了在clients/prospects/路由?

我试过这个:

match '/clients/prospects' => 'clients#prospects'

routes.rb中的其他一些内容,但当然会收到错误“无法找到id为=的潜在客户”。

这里的目标基本上是拥有潜在客户视图和客户视图,只需将隐藏字段切换为1,它(在用户的脑海中)将潜在客户转变为客户端(它是类似CRM的应用程序)

3 个答案:

答案 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/prospectsshow资源的clients路由匹配,因此如果首先定义那么那就是匹配的路线。

然而,有一种更惯用的方式来定义这条路线

resources :clients do
  collection do
    get :prospects
  end
end

有关详情,请参阅Rails Routing documentation

另请参阅migu关于在正确路由网址后需要执行 else 的答案(尽管还有其他事情可以做 - 如果两个视图足够相似,则可以例如,重用视图模板。