我的客户要求使用单个网址在其应用中完成工作流程:example.org/task/:token
。其中:token
是该任务的唯一ID。
在TaskController
动作index
中的:token
内用于查询任务对象,并根据任务的当前状态呈现视图:
def index
@task = Task.where(token: params[:token])
render @task.state.to_s
end
每个州都有一个视图,渲染视图的逻辑在视图中(UGLY !!)。
我想重构这个,以便使用Task状态来确定要渲染的控制器动作。我可以用render template: '#{state}/action'
做到这一点。但是这不会执行控制器动作逻辑。意思是我仍然坚持视图中的控制器逻辑!
我发现this solution有效,但它有点难看并打破了一些“魔法”(必须明确渲染视图)。
我的问题是,有没有更好的方法在Rails中实现这一点,同时仍然维护单个URL而不是重定向到新的URL?
答案 0 :(得分: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
答案 1 :(得分:0)
看看这个:http://railscasts.com/episodes/217-multistep-forms我认为ryanb在那里有一些好主意。基本上你有task.html.erb渲染适当的部分取决于你的任务所处的状态:
<%= render "#{@task.state}_state", :f => f %>