0

我的客户要求提供一个 url 来完成其应用程序中的工作流程:example.org/task/:token. :token该任务的唯一 ID在哪里。

TaskControllerinindex操作:token中用于查询任务对象,并根据任务的当前状态呈现视图:

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

每个状态都有一个视图,呈现视图的逻辑在视图本身中(丑陋!!)。

我想重构它,以便使用任务状态来确定要呈现的控制器操作。我可以做到这一点render template: '#{state}/action'。但这不会执行控制器动作逻辑。这意味着我仍然坚持视图中的控制器逻辑!

我发现这个解决方案有效,但它有点难看并且打破了一些“魔法”的轨道(必须显式渲染视图。)

我的问题是,有没有更好的方法在 Rails 中完成此任务,同时仍保持单个 url 而不会重定向到新的 url?

4

2 回答 2

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
于 2013-03-20T18:21:37.697 回答
0

看看这个:http: //railscasts.com/episodes/217-multistep-forms 我认为 ryanb 有一些好主意。基本上你会让你的 task.html.erb 渲染适当的部分,这取决于你的任务处于什么状态:

  <%= render "#{@task.state}_state", :f => f %>
于 2013-03-20T18:16:29.923 回答