2013-05-07 2 views
0

중첩 리소스에서 해당 리소스를 포함하는 리소스의 ID를 전달해야한다는 것을 알고 있습니다.Rails - 리소스를 포함 할 때 중첩 리소스로 라우팅하는 방법

그러나 사용자가 제품에 대한 리뷰를 만들고 실제로 경로를 통해 전달하는 대신 양식의 새보기에서 제품을 지정할 수있게하려고합니다. 따라서 제품을 사용하지 않고 검토 한 후에 양식의 모든 제품을 선택할 수있는 마스터 검토 양식이 제공됩니다.

이 작업을 수행하는 중에 오류가 발생하여 해결하지 못했습니다. 해결책은 무엇입니까?

#error 
No route matches {:action=>"new", :controller=>"reviews"}  

#view 
new_product_review_path 

#controller 
def new 
    #@product = Product.new 
    @review = Review.new 
end 

#routes.rb 
resources :products do 
    resources :reviews 
end 
+0

그런데 왜 @product = Product.new를 가지고 있습니까? –

답변

1

제품 내에 중첩 리뷰를 계속 뭔가 다른 경로를 포장 namespace 일을 사용하지만, 외부 후기 작성을 이동할 수 있습니다

# routes.rb 
resources :products do 
    resources :reviews, except: [:new, :create] 
end 

resources :reviews, only: [:new, :create] 

그런 다음 새로운 검토를 만들 new_review_path를 사용합니다.

특정 제품에 첨부 된 리뷰를 만들 수있는 옵션을 원한다면 중첩 된 리뷰에 대해 : except 옵션을 삭제하고 product_id.present?를 기반으로 컨트롤러 조치 및 양식을 수정하십시오.


편집 : 위의 예에서

(서풍의 후속 질문에 대한 응답에서), 나는 :new:create은 그 안에 외부에서 액세스 제품, 그리고해야한다는 지정한 리뷰에 :except:only 옵션을 사용하여 중첩 여부에 관계없이 리뷰를 통해 무엇이든 할 수 있기를 원할 경우 언제든지 삭제할 수 있습니다. 예를 들어, reviews#index/reviews/products/1/reviews을 모두 처리하므로 동일한 컨트롤러 동작이 요청을 처리 할 것이라는 점을주의해야합니다. 예를 들어, 컨트롤러가 제대로 처리합니다. 예를 들어 이전 필터를 사용하는 경우 :

# users_controller.rb 
before_filter :filter_by_product 

def filter_by_product 
    @parent_product = Product.find(params[:product_id]) if params[:product_id] 
    @reviews = @parent_product ? @parent_product.reviews : Review.all 
end 

def new 
    @review = @reviews.build 
end 

... 

중첩 여부에 따라보기를 변경해야 할 수도 있습니다. 예를 들어 검토 양식을 작성하는 양식에서 중첩되지 않은 제품을 드롭 다운하거나 product_id 인 숨겨진 필드로 대체 할 수 있습니다.

+0

routes 파일의 products 블록 외부에서 resources : 리뷰를 추가하여 거기에 보관하면 중첩되거나 중첩되지 않은 리소스에 액세스 할 수 있습니까? 나는 다른 stackoverflow 대답 – Zephyr4434

+0

에서 이것을 봤어, 네가 그 일을 멈추게 할 아무것도, 내가 내 대답의 끝에 가리키는 것입니다. 이 경우 두 경로 모두 동일한 컨트롤러 동작을 호출하므로 적절하게 동작하는지 확인해야합니다. 나는 그것을 확장하기 위해 내 대답에 약간을 추가했습니다. –

+0

자세한 답변을 주셔서 대단히 감사드립니다. – Zephyr4434

-1

이동 자원 : 블록

resources :products 
resources :reviews 

및 사용

new_review_path 

이 방법 밖에 리뷰, 사용자 리뷰는 모든 제품에 묶여되지 않습니다.

+0

해결 방법이 있습니까? 내 응용 프로그램의 경우 리뷰가 제품 컨텍스트 내에서만 의미가 있으므로 중첩 된 경로를 사용하는 것이 이상적인 상황 인 것 같습니다. – Zephyr4434

0

당신은

+0

이해할 수 있을지 모르겠습니까? 죄송합니다. – Zephyr4434

관련 문제