指定资源的顺序

时间:2011-04-25 23:40:47

标签: 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

但我想做这样的事情:

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”的帖子。有没有办法告诉rails在运行resources :posts之前运行get和put定义?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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