2013-03-20 1 views
0

클라이언트에서 응용 프로그램의 워크 플로를 완료하는 단일 URL을 요청했습니다 : example.org/task/:token. 여기서 :token은 해당 작업의 고유 ID입니다. index 행동 :token에서 TaskController레일 여러 컨트롤러에 대한 3 개의 단일 URL

는 작업 개체를 쿼리하는 데 사용되며,보기는 작업의 현재 상태에 따라 렌더링 : 모든 상태보기를 렌더링하기위한보기와 논리가

def index 
    @task = Task.where(token: params[:token]) 
    render @task.state.to_s 
end 

보기 자체에 있습니다 (웃기는 !!).

작업 상태를 사용하여 렌더링 할 컨트롤러 동작을 결정할 수 있도록 리팩토링하고 싶습니다. 나는 render template: '#{state}/action'으로 그것을 할 수있다. 그러나 이것은 컨트롤러 동작 로직을 실행하지 않습니다. 아직 컨트롤러 로직에 문제가 있습니다.

I 작동 this solution을 발견했습니다,하지만 조금 추한 및 레일의 일부를 나누기 "마법"(명시 적으로 뷰를 렌더링해야합니다.)입니다

내 질문에, 이러한 목표를 달성하기 위해 더 나은 방법이있다 Rails 내에서 단일 URL을 유지하면서 새 URL로 리디렉션하지 않습니까?

+0

아마 클라이언트 측 자바 스크립트가 옵션입니까? – tmaximini

답변

1

당신은 받아 들여지지 않았다 대답에 연결, 나는에서 허용 대답을 추천 할 것입니다 링크 (https://stackoverflow.com/a/6051812/1461068)

특히이 부분 :

def your_action 
    ... 
    render :action => :index 
end 

당신과 같이 처리 할 수있는 :

def index 
    @task = Task.where(token: params[:token]).first 
    render :action => get_action_for_state(@task.state.to_s) 
end 

private 

def get_action_for_state(state) 
    //logic to figure out which action to call 
end 
+0

저는 컨트롤러에 뷰 로직을 가져올 수 있다는 점에서이 점을 좋아합니다. 이상적인 경우는 하나의 컨트롤러에서 14 가지 액션을 수행 할 필요가 없도록 액션을 다른 컨트롤러로 이동하는 것입니다. : D –

+0

그게 뭐가 잘못 되었 니? 그들은 모두 관련이 있습니다, 안 그래요? 컨트롤러에 14 개의 동작을 가질 수 없다는 규칙은 없습니다. 또한 14 개의 다른 파일을 갖는 것이 더 낫겠습니까? – awbergs

+0

예, 재미있는 생각입니다. 조금 더 깨끗한 구현을 제공하기 위해 생각한 것은 일부 작업을 "하위"컨트롤러로 그룹화하고 이들을 포함시키는 것입니다. 그러면 14 개의 다른 파일을 건너 뛸 수 있습니다. 여전히 작업을 조금 더 잘 구성합니다. 어떻게 생각해? –

0

이것 좀보세요 : http://railscasts.com/episodes/217-multistep-forms 나는 거기에 좋은 아이디어가 있다고 생각합니다. 기본적으로 당신은 당신의 task.html.erb이 당신의 작업에 어떤 상태에 따라 적절한 부분을 렌더링 거라고 :

<%= render "#{@task.state}_state", :f => f %> 
+0

나는 여전히 비디오를보고있다. 그러나 이것은 현재 솔루션과 동일하지만, 뷰에서 렌더링하는 대신 컨트롤러에서 렌더링한다. –

관련 문제