Rails中的匹配和路由

时间:2013-08-21 22:46:48

标签: ruby-on-rails ruby routes

我生成了一个控制器并更改了路由,但打开链接会在我的本地服务器上产生错误。

生成控制器和路线

rails generate controller StaticPages home about team contact

更改routes.rb

MyApp::Application.routes.draw do
  root to: 'static_pages#home'

  match '/about',    to: 'static_pages#about'
  match '/team',     to: 'static_pages#team'
  match '/contact',  to: 'static_pages#contact'
end

根路径有效但“约会”,“团队”或“联系”链接都不起作用。这是我得到的错误:

“如果没有指定HTTP方法,则不应在路由器中使用match方法。如果要将操作公开给GET和POST,请添加via: [:get, :post]选项。如果要公开你的行动要GET,在路由器中使用get:而不是:匹配“控制器#动作”做:得到“控制器#动作”“

为什么我不能使用'匹配'?

3 个答案:

答案 0 :(得分:27)

match method has been deprecated.

使用get进行GET,post进行POST。

get '/about', to: 'static_pages#about'

答案 1 :(得分:13)

您可以使用match,您必须添加via:选项:

match '/about',    to: 'static_pages#about', via: :get
match '/team',     to: 'static_pages#team', via: :get
match '/contact',  to: 'static_pages#contact', via: :get

如果需要,您还可以将其他HTTP谓词传递给via:,例如via: [:get, :post]

来源:Rails Routing Guide

答案 2 :(得分:0)

首先,您必须在via: :get

末尾添加match 'st' => 'controller#action来指定HTTP方法

最好使用get '/home', to: 'static_pages#home'

但是,存在一个问题,即您的代码不遵循RESTful,只支持7个操作:索引,新建,编辑,创建,更新,显示和销毁。

这是两个解决方案:

SOL 1 :将它们放在不同的控制器(家庭,约...)中,所有这些控制器都有index动作。

SOL 2 :如果工作太多,我们可以将它们与show动作相匹配。我们使用static_pages控制器,每个页面(home,about)都是一个项目。

路线看起来很喜欢 /static_pages/home /static_pages/about

我知道由于前缀static_pages而不好。

我们可以通过在路径文件末尾添加自定义路径来轻松摆脱这种情况:

get '/:id', to: 'static_pages#show'

就是这样。如果你认为它太多了(我也是这么认为),请查看这个gem High Voltage。玩得开心。