2011-04-25 67 views
0

我正在尝试向我的应用程序添加路径。我有我想要的功能的代码,但我想对它进行分组,以便更直观地阅读。下面的代码:指定资源顺序

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(用于显示)匹配,并提供错误,因为它无法找到ID为“search”的帖子。有没有一种方法可以告诉rails在运行resources :posts之前运行get和put定义?

回答

1

你的路线不工作的原因是因为它们是在每个员额上定义的,所以/posts/1/posts/search。您应该运行rake routes来检查您的路线正在进行。

要解决您的问题,您可能需要修复这些路径路径并确保您在整个集合中定义了搜索路径。如果这很混乱,请检查guide

resources :posts do 
    get :search, :on => :collection 
end 

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

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 
+0

你说得对使用'PUT帖子#search_result'。我在写这篇文章后意识到它应该是一个'GET'。谢谢你的深思熟虑的答案。你的答案和dinatih的工作,但我给这个给你额外的描述。 – 2011-04-26 00:38:22

+0

@Eric Hu:谢谢你的接受。让我变傻,但不应该将/ posts/search的搜索结果作为帖子本身,而不是单独的类型?换句话说,每个搜索结果的链接都不应该是/ post/id吗? – coreyward 2011-04-26 04:33:00

+0

谢谢你的回答!正如我现在计划的那样,'posts#search_results'(我在代码中添加了s)就像'posts#index',但只列出了与'posts#search'中输入的用户搜索参数相关的帖子。目前,它实际上使用'posts#index'视图,但我期望为'posts#search_results'制作一个单独的视图,以便可以通过AJAX完成。那有意义吗? – 2011-04-26 21:02:07

1
resources :posts do 
    collection do 
    get :search, :as => :search_posts 
    put :search_result, :as => :search_posts_result 
    end 
end 
+0

啊,这工作。谢谢!我之前尝试过这样做,但忘记将'posts/search'更改为'search'。 – 2011-04-26 00:32:56

+0

;),所以你可以验证我的答案。 – Dinatih 2011-04-26 00:52:51

+0

:P我很难在你的答案和核心之间选择,因为他们都工作。你的提前2分钟,但我觉得他的帖子多一点解释。尽管你答复我感谢你的答复。对不起,如果可以的话,我会将它们标记为正确! – 2011-04-26 01:10:02