我在routes.rb文件中添加了这一行
map.connect ':controller/:action/:id/:title', :controller => "recipes"
认为我在URL的末尾添加了配方标题,这只适用于配方控制器。我还在文件的开头声明了一个像这样的资源
map.resources :recipes
以下网址完美无缺
http://localhost:3000/recipes/show/84/testing201
http://localhost:3000/recipes/edit/84/testing2010
然而,当我说rake路线时,我得到以下配方控制器
recipes GET /recipes(.:format) {:controller=>"recipes", :action=>"index"}
POST /recipes(.:format) {:controller=>"recipes", :action=>"create"}
new_recipe GET /recipes/new(.:format) {:controller=>"recipes", :action=>"new"}
edit_recipe GET /recipes/:id/edit(.:format) {:controller=>"recipes", :action=>"edit"}
recipe GET /recipes/:id(.:format) {:controller=>"recipes", :action=>"show"}
PUT /recipes/:id(.:format) {:controller=>"recipes", :action=>"update"}
DELETE /recipes/:id(.:format) {:controller=>"recipes", :action=>"destroy"}
在底部我看到了这个
/:controller/:action/:id/:title
/:controller/:action/:id
/:controller/:action/:id(.:format)
从输出看起来似乎标题不适用于配方路线,但它在全球范围内应用。我该如何解决这个问题,所以通配符(“/:controller /:action /:id /:title”中的“:title”)只适用于食谱?
答案 0 :(得分:0)
您正在混合两种不同的路由概念。一个是RESTful路线(在谷歌上阅读它),另一个是通用/一般路线。你应该只使用其中一个。建议使用RESTful(map.resources :recipes
)。但首先你需要决定使用哪一个。
另外这个定义是错误的:
map.connect ':controller/:action/:id/:title', :controller => "recipes"
你有:路由中的控制器变量,然后你说:控制器应该绑定到'食谱'。解决这个问题的一种方法是:
map.connect '/recipes/:action/:id', :controller => "recipes"
或更好
map.connect '/recipes/:id/:action', :controller => "recipes"
你正在接近RESTful路线。
如果您想要路线中的标题,那么请使用带有RESTful资源的命名路线。但请勿在一条路线中混用:id
和:title
。只使用一个参数(或两者合并但这是另一个故事)。
map.resources :recipes, :except => [:show]
map.recipe '/recipe/:title', :controller => 'recipes', :action => 'show'
您可能需要覆盖to_param
模型中的Recipe
方法:
def Recipe < ActiveRecord::Base
def to_param
title
end
end
答案 1 :(得分:0)
我会评论map.resources,评论连接并再次使用map.with_options:
map.with_options :controller => 'recipes' do |recipes|
recipes.list '', :action => 'index'
recipes.delete '/delete/:id/:title', :action => 'delete'
recipes.edit '/edit/:id/:title', :action => 'edit'
end