Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在不复制控制器名称的情况下编写Rails 4路由名称空间?_Ruby On Rails_Routes - Fatal编程技术网

Ruby on rails 如何在不复制控制器名称的情况下编写Rails 4路由名称空间?

Ruby on rails 如何在不复制控制器名称的情况下编写Rails 4路由名称空间?,ruby-on-rails,routes,Ruby On Rails,Routes,我希望能够写的是: namespace :cats do get '/:breed/' => '#search_by_breed' get '/:breed/count' => '#count_by_breed' end 但这就导致了这些路线: GET /cats/:breed(.:format) cats/#search_by_breed GET /cats/:breed/count(.:format) cats/#count_by

我希望能够写的是:

  namespace :cats do
    get '/:breed/' => '#search_by_breed'
    get '/:breed/count' => '#count_by_breed'
  end
但这就导致了这些路线:

  GET  /cats/:breed(.:format)       cats/#search_by_breed
  GET  /cats/:breed/count(.:format) cats/#count_by_breed
   GET  /:breed(.:format)       cats#search_by_breed
   GET  /:breed/count(.:format) cats#count_by_breed
考虑到
cats/#show
中的斜杠,这将不起作用

我知道我可以通过以下方法做到这一点:

  get '/:breed/' => 'cats#search_by_breed'
  get '/:breed/count' => 'cats#count_by_breed'
这导致了这些路线:

  GET  /cats/:breed(.:format)       cats/#search_by_breed
  GET  /cats/:breed/count(.:format) cats/#count_by_breed
   GET  /:breed(.:format)       cats#search_by_breed
   GET  /:breed/count(.:format) cats#count_by_breed
但是,每次都会重复命名
cats
控制器,这是我不愿意做的(在我的实际代码中,我有比上面列出的两条更多的路由。不幸的是,我实际上没有在cat搜索网站上工作…)。我以为这附近会有很多人


我错过什么了吗?只是做了些枯燥的命令?这似乎相当普遍,但我在中没有发现任何类似的情况。

要回答您的主要问题,这是一种编写路线以实现您想要的目标的方法:

resources :cats, only: [], path: ":breed" do
  collection do
    get 'search_by_count', path: 'count'
    get 'search_by_breed', path: '/'
  end
end
这将生成以下路由:

search_by_count_cats GET    /:breed/count(.:format)  cats#search_by_count
search_by_breed_cats GET    /:breed(.:format)        cats#search_by_breed
当然,您仍然可以使用单独的
资源声明:cats
来获得索引、显示等的更RESTful版本

回答你的第二个问题,“我是不是做得太过分了?”。在我的经验中,我见过很多情况下,我们以牺牲可读性为代价,将干涸过度,从而导致耦合增加。我个人发现破译以下内容需要更少的脑力开销:

get '/:breed/'        => 'cats#search_by_breed'
get '/:breed/count'   => 'cats#count_by_breed'
get '/:breed/another' => 'cats#another_route'
要想了解更多关于如何明智地使用DRY的想法,我将提供这篇文章和这篇演讲