Ruby on rails 在常规管线中定义默认值

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

我将这一行添加到routes.rb文件中

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