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