2010-03-07 6 views
0

다음 질문은 경로에서 컨트롤러로 변수를 전달하는 것과 관련이 있습니다. 하나의 모델을 가진 Ruby on Rails (v 2.3.3) 앱이 있는데,이 뷰는 여러보기를 통해 사용자에게 전달됩니다. 현재의 솔루션은 다중 라우트에 의해 트리거되는 다중 컨트롤러를 사용합니다. 예를 들면 다음과 같습니다.레일에서 RESTful 라우팅을 통해 컨트롤러에 변수 전달

ActionController::Routing::Routes.draw do |map| # defines map 

map.resource :simpsons, :only => [] do |b| 
    b.resources :episodes, :controller => "SimpsonsEpisodes" 
end 
map.resource :flintstones, :only => [] do |b| 
    b.resources :episodes, :controller => "FlintstonesEpisodes" 
end 

그러나 DRYness를 위해이 라우트를 동일한 컨트롤러로 작동시키고 싶습니다. 제어기가 경로 사이에서 구별되도록하기 위해 경로를 통해 변수를 전달하려고합니다. 예를 들어 :

case(type) 
when "simpsons" then ... do something for the Simpsons ... 
when "flintstones" then ... do something for the Simpsons ... 
else  .... do something for all episodes .... 
end 

내가 아닌 편안하고 라우팅 (map.with_options 등)이 작업을 수행하는 방법을 발견,하지만 난 좋겠 :

map.resource :simpsons, :only => [] do |b| 
    b.resources :episodes, :controller => "Episodes", :type => "simpsons" 
end 
map.resource :flintstones, :only => [] do |b| 
    b.resources :episodes, :controller => "Episodes", :type => "flintstones" 
end 

그래서 컨트롤러에서 나는이 작업을 수행 할 수 map.resource()로 RESTful 경로를 사용하는 것을 선호합니다. 하나의 추악한 솔루션은 컨트롤러에서 요청 URI를 구문 분석하는 것일 수 있습니다.

답변

1

응답이 없으므로 해결책을 찾았으므로이 질문에 직접 답할 것입니다. 여러 항목이있는 모델이나 테이블이있을 수있는 상황이 있지만 그 중 일부에 대해 별도의 뷰가 필요할 수도있는 상황이라면 약간 이점이 있습니다.

서로 다른 인덱스가 좋아하고 간단하게 사용 수집 GET에 대한 것입니다 가장 가능성 :

map.resources :episodes, :collection => {:simpsons=> :get, :flintstones=> :get} do |episode| 
....and so on 

는 간단히 컨트롤러에서 "심슨 가족"과 "플린트 스톤"라는 방법을 추가 할 수 있습니다. 그리고 편집,보기 및 삭제 메소드의 경우 필요한 경우 엔트리 ID를 확인하여 약간의 추가 로직을 사용할 수 있습니다. @episode = Episode.find (params [: id])와 같은 것, @ episode.criteria == ... something ... 그러면이 뷰 또는 다른 뷰를 렌더링합니다.

관련 문제