ruby on rails 3 -指定资源的顺序



我想添加一个路径到我的应用程序。我有代码,我想要的功能,但我想分组它不同,使它更直观地阅读。下面是代码:

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为"搜索"的帖子。是否有一种方法,我可以告诉rails在运行resources :posts之前运行get和put定义?

你的路由不工作的原因是因为它们是在每个帖子的成员上定义的,所以/posts/1/posts/search。你应该运行rake routes来检查你的路由要去哪里。

要解决这个问题,您可能需要修复这些路由路径,并确保在整个集合上定义搜索路由。如果这让你感到困惑,请查看指南。

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
resources :posts do
  collection do
    get :search, :as => :search_posts
    put :search_result, :as => :search_posts_result
  end 
end

相关内容

  • 没有找到相关文章

最新更新