2013-03-20 89 views
0

我的客戶已經要求一個URL來完成其應用程序中的工作流程:example.org/task/:token。其中:token是該任務的唯一ID。Rails 3多個控制器的單個url

內的index行動:tokenTaskController用於查詢任務對象和視圖是基於任務的當前狀態呈現:

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

每個州都有渲染視圖的視圖和邏輯在視圖中(UGLY !!)。

我想重構這個,以便使用任務狀態來確定要呈現哪個控制器動作。我可以用render template: '#{state}/action'來做到這一點。但是這不會執行控制器動作邏輯。這意味着我仍然堅持視圖中的控制器邏輯!

我發現this solution這樣的作品,但它是一個有點難看,打破一些軌道的「神奇」(必須明確地渲染視圖)。

我的問題是,是否有更好的方法來做到這一點在Rails內仍然保持單個網址,而不是重定向到一個新的網址?

+0

也許客戶端JavaScript是一個選項? – tmaximini 2013-03-20 18:33:15

回答

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 – 2013-03-20 18:26:41

+0

這是什麼問題?他們都是相關的,不是嗎?沒有規定說你在控制器中不能有14個動作。還有14個不同的文件真的會更好嗎? – awbergs 2013-03-20 18:36:17

+0

雅這是一個有趣的想法...我想提供一個更清潔的實現的一點是將一些行動分組到「子」控制器,幷包括那些。這將允許我跳過14個不同的文件,但仍然組織任務好一點。你怎麼看? – 2013-03-20 18:40:07

0

看看這個:http://railscasts.com/episodes/217-multistep-forms我認爲ryanb在那裏有一些好主意。基本上,你有你的task.html.erb呈現適當部分取決於什麼狀態,你的任務是:

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

我仍在觀看視頻,但它看起來像我目前的解決方案一樣,但不是在視圖中呈現,而是在控制器中呈現。 – 2013-03-20 18:30:00