【问题标题】:Rails 3 single url for multiple controllers用于多个控制器的 Rails 3 单个 url
【发布时间】:2013-03-20 17:51:23
【问题描述】:

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

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

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

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

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

我发现 this solution 有效,但它有点难看,并且打破了一些“神奇”的轨道(必须显式渲染视图。)

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

【问题讨论】:

  • 也许客户端javascript是一个选项?

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


【解决方案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

【讨论】:

  • 我喜欢这样,因为我可以将视图逻辑带入控制器。理想的情况是将动作移动到不同的控制器,这样我就不必在单个控制器中有 14 个不同的动作! :D
  • 这有什么问题?它们都是相关的,不是吗?没有规则说控制器中不能有 14 个动作。另外,拥有 14 个不同的文件真的会更好吗?
  • 是的,这是一个有趣的想法......我想提供一些更清洁的实现是将一些动作分组到“子”控制器中并将它们包含在内。这将允许我跳过 14 个不同的文件,但仍能更好地组织任务。你怎么看?
  • 老实说,我认为一个控制器中的 14 个动作并不疯狂,您绝对可以将动作逻辑从那里提取到单独的文件中以减少噪音。
【解决方案2】:

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

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

【讨论】:

  • 我还在看视频,但这似乎和我目前的解决方案一样,但不是在视图中渲染,而是在控制器中渲染。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多