Ruby on rails 3 指定资源的顺序

Ruby on rails 3 指定资源的顺序,ruby-on-rails-3,resources,Ruby On Rails 3,Resources,我正在尝试向我的应用程序添加路径。我有自己喜欢的功能代码,但我想对它进行不同的分组,以便更直观地阅读。代码如下: get 'posts/search' => 'posts#search', :as => :search_posts put 'posts/search_result' => 'posts#search_result', :as => :search_posts_result resources :posts do end 但我想这样做: re

我正在尝试向我的应用程序添加路径。我有自己喜欢的功能代码,但我想对它进行不同的分组,以便更直观地阅读。代码如下:

get 'posts/search' => 'posts#search',
  :as => :search_posts

put 'posts/search_result' => 'posts#search_result',
  :as => :search_posts_result

resources :posts do

end
但我想这样做:

resources :posts do
  get 'posts/search' => 'posts#search',
    :as => :search_posts

  put 'posts/search_result' => 'posts#search_result',
    :as => :search_posts_result
end

这是一个非常小的区别,但是使用后一种方法首先定义运行
resources:posts
。结果,Rails尝试将
/posts/search
/posts/:id
(用于show)匹配,并给出一个错误,因为它找不到id为“search”的帖子。在运行
参考资料:posts
之前,我有没有办法告诉rails运行get和put定义?

路由不起作用的原因是它们在posts的每个成员上定义,所以
/posts/1/posts/search
。您应该运行
rake routes
,以检查您的路由的去向

要解决问题,您可能需要修复这些路由路径,并确保在整个集合上定义搜索路由。如果这令人困惑,请检查

你也不需要你所有的其他东西。这将为您创建以下所有路线:

search_posts GET    /posts/search(.:format)    {:action=>"search", :controller=>"posts"}
       posts GET    /posts(.:format)           {:action=>"index", :controller=>"posts"}
             POST   /posts(.:format)           {:action=>"create", :controller=>"posts"}
    new_post GET    /posts/new(.:format)       {:action=>"new", :controller=>"posts"}
   edit_post GET    /posts/:id/edit(.:format)  {:action=>"edit", :controller=>"posts"}
        post GET    /posts/:id(.:format)       {:action=>"show", :controller=>"posts"}
             PUT    /posts/:id(.:format)       {:action=>"update", :controller=>"posts"}
             DELETE /posts/:id(.:format)       {:action=>"destroy", :controller=>"posts"}
Rails在默认资源路由之前定义整个集合上的路由(如上所示),因此路由优先

至于你的
PUT posts#search_result
方法,那真的很混乱-你想手动更新搜索结果吗


根据评论:我建议这样做,而不是对搜索结果进行单独操作。通常,搜索页面在有结果或无结果的情况下看起来都是一样的,但如果您进行搜索但未发现任何结果,则会显示错误消息。优雅地处理在没有查询的情况下显示搜索页面的情况可以禁止冗余操作

def search
  @query == params[:q] || ''

  # search logic

  flash[:error] = 'Nothing found message' if @results.empty? unless @query.blank?
end

啊,这个奏效了。谢谢我之前试过这样做,但忘了将“posts/search”改为“search”。),所以你能验证我的答案吗?:P我很难在你的答案和coreyward的答案之间做出选择,因为它们都有效。你的帖子早了2分钟,但我觉得他的帖子解释得更多一些。不过我给了你一票,感谢你的回答。对不起,如果可以的话,我会把它们都标对的!你使用
发布帖子#搜索结果
是对的。写了这篇文章之后,我意识到它应该是一个
GET
。谢谢你周到的回答。你的答案和迪纳提斯的答案都有效,但我给你这一个是为了额外的描述。@Eric Hu:谢谢你的接受。给我涂上愚蠢的颜色,但是/posts/search的搜索结果不应该是post本身,而不是单独的类型吗?换句话说,每个搜索结果的链接不应该是a/post/id吗?谢谢你的回答!正如我目前计划的那样,
posts#search#u results
(我在代码中添加了一个s)类似于
posts#index
,但只列出与用户在
posts#search
中输入的搜索参数相关的帖子。目前,它实际上使用了
posts#index
视图,但我希望为
posts#search(搜索结果
创建一个单独的视图,这样就可以用AJAX完成。这有意义吗?这不是与
获取帖子#搜索
相同的页面吗?您是否正在从
搜索
重定向到
搜索结果
?我更新了我的答案,添加了一个可能对您有所帮助的片段。
def search
  @query == params[:q] || ''

  # search logic

  flash[:error] = 'Nothing found message' if @results.empty? unless @query.blank?
end
resources :posts do
  collection do
    get :search, :as => :search_posts
    put :search_result, :as => :search_posts_result
  end 
end