Rails 3单个URL用于多个控制器

时间:2013-03-20 17:51:24

标签: ruby-on-rails ruby ruby-on-rails-3

我的客户要求使用单个网址在其应用中完成工作流程: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?

2 个答案:

答案 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 %>