在没有HTTP重定向的情况下,从另一个控制器操作运行一个控制器操作的正确方法是什么?

Sco*_*len 10 ruby-on-rails

我希望能够基于查询参数和数据库中的数据的组合,从一个控制器动作有条件地发送到另一个控制器动作.

我现在拥有的是:

class OldController < ApplicationController
  def old_controller_action
    if should_use_new_controller
      new_params = params.dup
      new_params[:controller] = "new_controller_action"
      redirect_to new_params
      return
    end
    # rest of old and busted
  end
end

class NewController < ApplicationController
  def new_controller_action
    # new hotness
  end
end
Run Code Online (Sandbox Code Playgroud)

这样可以正常工作,但它会发出HTTP重定向,这很慢.我希望能够做同样的事情,但在同一个HTTP请求中.

有干净的方法吗?

编辑:赏金将转到可以向我展示干净方式的人,使控制器及其操作相对不受影响(除了重定向代码本身).

Aug*_*aas 13

而不是跨操作调用代码,将代码提取到lib /或其他东西,并从两个控制器调用该代码.

# lib/foo.rb
module Foo
  def self.bar
  # ...
  end
end

# posts_controller
def index
  Foo.bar
end

# things_controller
def index
  Foo.bar
end
Run Code Online (Sandbox Code Playgroud)


小智 9

创建控制器类的实例:

@my_other_controller = MyOtherController.new
Run Code Online (Sandbox Code Playgroud)

然后调用它上面的方法:

@my_other_controller.some_method(params[:id])
Run Code Online (Sandbox Code Playgroud)

我更喜欢模块的想法,但这应该可以解决问题.