2013-03-20 88 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