2011-04-25 5 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는. 결과적으로 레일즈는 /posts/search/posts/:id (show)와 일치 시키려고 시도하고 id가 'search'인 게시물을 찾을 수 없으므로 오류가 발생합니다. 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"} 

레일은 당신의 경로가 우선되도록 기본 수완 경로 전에 전체 컬렉션에 경로를 정의합니다.

귀하의 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 모두 효과가 있었지만 추가 설명을 위해이 답변을드립니다. –

+0

@ Eric Hu : 동의 해 주셔서 감사합니다. 나 바보 같은 색이지만,/posts/search에 대한 검색 결과가 게시물 자체가 아닌 별도의 유형이되어야합니까? 즉, 각 검색 결과에 대한 링크가/post/id가 아니어야합니까? – coreyward

+0

답변 해 주셔서 감사합니다! 현재 계획대로 'posts # search_results' (코드에 s를 추가했습니다)는'posts # index'와 비슷하지만'posts # search'에 입력 된 사용자 검색 매개 변수와 관련된 게시물 만 나열됩니다. 당분간, 실제로는 posts # index' 뷰를 사용하지만 AJAX로 수행 할 수 있도록'posts # search_results'에 대한 별도의 뷰를 만들 것을 기대합니다. 말이 돼? –

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

아, 이것이 효과적입니다. 감사! 나는 이것을 일찍 시도했지만 'posts/search'를 'search'로 바꾸는 것을 잊어 버렸다. –

+0

;), 그럼 제 대답을 확인해주십시오. – Dinatih

+0

: P 나는 둘 다 작동하기 때문에 대답과 핵심 사이를 선택하는 것이 힘들었습니다. 너의 것이 2 분 일찍 있었지만 나는 그의 포스트가 조금 더 설명했다고 느꼈다. 나는 당신에게 당신의 대답을위한 감사로서 upvote를 줬다. 미안, 내가 할 수 있으면 둘 다 맞을거야! –