我正在尝试为我的应用添加路径。我的代码功能正如我所希望的那样,但我想以不同的方式对其进行分组,以便更直观地阅读。这是代码:
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定义?
答案 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