Rails忽略了收集路由,而是与show action一起使用

时间:2010-06-23 06:48:24

标签: ruby-on-rails ruby-on-rails-3

我在routes.rb文件中设置了以下路由:

resources :people do 
  collection do
    get :search
  end
end

当我对网址http://localhost:3000/people/search.json?term=stepeb执行操作时, 服务器报告它正在响应show动作,使用正确的term参数,但也有一个id参数,设置为“search”。

我认为这个问题是两个网址 节目网址将是:

/people/:id

我相信路由器在到达/ people / search

之前匹配该路由

如果是这样的话,基于收集的路线将如何运作?他们都不会受到节目动作的影响吗?

佣金路线的相关部分如下:

 search_people GET      /people/search(.:format)                                                         {:action=>"search", :controller=>"people"}
                                     GET      /people(.:format)                                                                {:action=>"index", :controller=>"people"}
                              people POST     /people(.:format)                                                                {:action=>"create", :controller=>"people"}
                          new_person GET      /people/new(.:format)                                                            {:action=>"new", :controller=>"people"}
                                     GET      /people/:id(.:format)                                                            {:action=>"show", :controller=>"people"}
                                     PUT      /people/:id(.:format)                                                            {:action=>"update", :controller=>"people"}
                              person DELETE   /people/:id(.:format)                                                            {:action=>"destroy", :controller=>"people"}
                         edit_person GET      /people/:id/edit(.:format)                                                       {:action=>"edit", :controller=>"people"}

3 个答案:

答案 0 :(得分:27)

是的,忘了这个。事实证明我有一个重复的资源:人们排在路线文件的顶部。 Rails首先击中了它。在我看来,确实应该在那里检查重复的路线定义。

答案 1 :(得分:1)

我也有类似的问题。根据你的例子,我的routes.rb看起来像这样

resources :people

...

resources :people do
    collection do
      get :search
    end
  end

将其更改为:

resources :people do
    collection do
      get :search
    end
  end

...

resources :people

我可以访问该系列...... 顺便说一下,这是添加路线的合适方式吗?即,在向控制器添加动作并留下“旧”资源时添加新路线是不错的风格:人们喜欢它?

答案 2 :(得分:0)

您运行的是什么版本的Rails?尝试使用您在此处提供的代码创建测试应用程序,看看它是否有效。可能还有其他一些你没有提到的冲突。

在Rails 3.0.0beta4上使用您的代码产生了预期的结果:

Started GET "/people/search.json?term=boo" for 192.168.1.2 at 2010-06-23 03:39:26 -0400
  Processing by PeopleController#search as JSON
  Parameters: {"term"=>"boo"}
Completed   in 49ms

这是我的路线档案:

  resources :people do
    collection do
      get :search
    end
  end

我有一个people_controller.rb,其中定义了搜索方法。