0

我正在使用 ruby​​ on rails 制作一个简单的社交网站,其中包括学生团体每个委员会的不同留言板。我希望每个委员会的 url 结构看起来像这样https://<base_url>/boards/<committee_name>,这会将用户带到该委员会的留言板。

我的 routes.rb 文件如下所示:

resources :committees, only: [:index] 
match '/boards/:name', to: 'committees#index(name)'

我的 Committees_controller.rb 文件的索引函数如下所示:

def index(name)  
   @posts = Committee.where(name: name)  
end

然后我将使用@posts页面上的变量来显示所有帖子,但是现在当我导航到时,https://<base_url>/boards/<committee_name>我得到一个未知操作错误,它说The action 'index(name)' could not be found for CommitteesController

有人可以指导我完成我做错了什么吗?

一旦我得到这个工作,我将如何制作一个反映这个 url 结构的视图?

4

2 回答 2

1

像这样设置你的路线:

resources :committees, only: [:index]
match '/boards/:name', to: 'committees#show'

和这样的控制器:

def index
   @committees = Committee.all
end

def show
   @committee = Committee.find_by_name!(params[:name])
end

您无法像尝试使用的方式将参数真正传递给控制器​​操作index(name)。相反,您使用paramsRails 提供的哈希值。路由声明的:name部分告诉 Rails 将任何匹配的内容放入params[:name].

您还应该使用单独的操作来列出委员会并显示单个委员会。按照 Rails 约定,这些应该分别是indexshow动作。

于 2013-04-01T19:53:01.463 回答
0

路由时,您只指定方法名称,而不是参数:

match '/boards/:name', to: 'committees#show'

一般来说,你会声明一些东西,resourcesmatch不能两者兼而有之。为了保持 REST-ful,这应该是show方法。索引是一种collection方法,通常不采用任何类型的记录标识符。

参数总是通过params结构进入:

def show
  @posts = Committee.where(name: params[:name])
end

通过路由公开的控制器方法不带参数。您可以构造private为其他目的使用参数的方法。

于 2013-04-01T19:52:26.520 回答