2014-09-03 50 views
0

我在routes.rb路线得到错误

get 'orders/:id-:phone', to: 'orders#show', as: :order_phone 
get ':id/:url', to: 'point_pages#show', as: :page_url 

于是两个get方法,Order模型,我需要有网址,如:domain.com/orders/1-88888888888(88888888888 - 是的order.user电话号码),并为PointPage模型 - domain.com/1/some_long_point_page_url

但是,当我创建新Order和轨道redirect to order_phone_path(@order),我收到一个错误:

Couldn't find PointPage with id=orders 

所以,我要告诉轨,当URL是domain.com/orders/...,它采用了第一get方法Order,和当URL是domain.com/1-...(或其他数字)时,它使用PointPage的第二个get方法。

谢谢!

回答

1

如果你真的要使用路由因此然后交换get方法的位置调用:

get ':id/:url', to: 'point_pages#show', as: :page_url 
get 'orders/:id-:phone', to: 'orders#show', as: :order_phone 

通过这种方式,第一条路线映入URI。请注意,定义的路线顺序非常重要。如果两条路线匹配给定模式,则使用前面定义的路线。

注意,与这样的定义:

get ':id/:url', to: 'point_pages#show', as: :page_url 

的所有路由会被它抓到。所以,建议在任何变量之前添加路径到控制器或一些独特的文字。 E.g:

get 'point_pages/:id/:url', to: 'point_pages#show', as: :page_url 
+0

是的,它解决了问题中获益。对于搜索引擎优化的目的,我不需要任何其他字符串在URI中的PointPage。谢谢! – 2014-09-03 20:34:13

0

你可能要做到以下几点:

#config/routes.rb 
resources :point_pages, only: [], path: "" do 
    get :url, action: :show, as: :page_url # -> domain.com/:id/:url to show 
end 

resources :orders, only: [] do 
    get ":id-:phone", action: :show, on: :collection, as: :order_phone # -> domain.com/orders/:id-:phone 
end 

这可能看起来有点偶然,但它绝对让你的应用的路由作为公约将直接最好的方式。

我知道你有答案,所以希望这会给你一些更深入的了解,你可以从结构化路线如上