Ruby on rails 在常规管线中定义默认值
我将这一行添加到routes.rb文件中Ruby on rails 在常规管线中定义默认值,ruby-on-rails,routing,Ruby On Rails,Routing,我将这一行添加到routes.rb文件中 map.connect ':controller/:action/:id/:title', :controller => "recipes" 认为我在URL的末尾添加了配方标题,这只适用于配方控制器。我还在文件的开头声明了一个资源,如下所示 map.resources :recipes 下面的URL工作得非常好 http://localhost:3000/recipes/show/84/testing201 http://localhost:3
map.connect ':controller/:action/:id/:title', :controller => "recipes"
认为我在URL的末尾添加了配方标题,这只适用于配方控制器。我还在文件的开头声明了一个资源,如下所示
map.resources :recipes
下面的URL工作得非常好
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”)仅适用于配方?您混合了两种不同的路由概念。一种是RESTful路由(在谷歌上阅读),另一种是通用/通用路由。你应该只使用其中一个。建议使用RESTful(
map.resources:recipes
)。但首先你需要决定使用哪一个
加上这个定义是错误的:
map.connect ':controller/:action/:id/:title', :controller => "recipes"
在路由中有:controller变量,然后说:controller应该绑定到“recipes”。解决这一问题的一种方法是:
map.connect '/recipes/:action/:id', :controller => "recipes"
或者更好
map.connect '/recipes/:id/:action', :controller => "recipes"
你越来越接近宁静的路线
如果您希望在路由中使用标题,那么使用命名路由和RESTful资源。但不要将:id
和:title
混合在一条路线中。只使用一个参数(或两者结合使用,但这是另一回事)
您可能需要覆盖配方
模型中的to_param
方法:
def Recipe < ActiveRecord::Base
def to_param
title
end
end
def配方
我会对map.resources进行注释,对connect进行注释,然后使用map.with\u选项再进行一次注释:
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
谢谢你的信息,它的工作预期。但是,默认的edit link()会导致错误。看起来它正在尝试“显示”操作,而不是“编辑”。map.resources:recipes,:except=>[:show]map.recipe'/recipes/:id/:title',:controller=>“recipes”,:action=>“show”有什么想法?/recipes/:id/:title->同样,这是错误的;使用:id或:title并使用单数形式,这样它就不会与map.recipes冲突,比如:`map.recipe'/recipe/:id',:controller=>'recipes',:action=>'show'我认为我不应该离开rails提供的默认设置。所以我决定将showURL的格式改成这样。我对to_param给出了自己的定义,这似乎很有效。我认为最好还是坚持安静的做事方式。我刚刚更改了URL的格式(localhost:3000/recipes/84-testing2010),这似乎很好。
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