如何在不离开当前控制器的情况下从另一个控制器执行操作

时间:2013-11-22 10:12:53

标签: ruby-on-rails

class UsersController < ApplicationController
  def create
    # call the action do_something from ImagesController
    # continue in the normal flow
  end
end

class ImagesController < ApplicationController
  def do_something
    ...
  end
end

我想在do_something ImagesController中调用UsersController中的操作,但在执行后我想继续执行create操作的正常流程,很少问题:

  • 这是一种不好的做法吗?
  • 我该怎么做?我是否必须创建ImagesController的实例,然后调用该操作或是否有另一种方式?

2 个答案:

答案 0 :(得分:2)

你可以在技术上创建另一个控制器的实例并在其上调用方法,但它很繁琐,容易出错并且不推荐使用。

如果该函数对两个控制器都是通用的,那么你应该在ApplicationController或你创建的另一个超类控制器中使用它。

class ApplicationController < ActionController::Base
  def common_to_all_controllers
    # some code
  end
end

class SuperController < ApplicationController
  def common_to_some_controllers
    # some other code
  end
end

class MyController < SuperController
  # has access to common_to_all_controllers and common_to_some_controllers
end

class MyOtherController < ApplicationController
  # has access to common_to_all_controllers only
end

另一种方法是

# lib/common_stuff.rb
module CommonStuff
  def common_thing
    # code
  end
end



# app/controllers/my_controller.rb
require 'common_stuff'
class MyController < ApplicationController
  include CommonStuff
  # has access to common_thing
end

来源 - Calling a method from another controller

答案 1 :(得分:0)

实际上这是可能的。并不那么难。

那就是说。这是不好的做法。非常糟糕的做法。

您要做的是将您要调用的控制器中的逻辑提取到服务对象中或将其移动到模型中。另外,您也可以让您的第一个控制器继承您尝试调用的控制器。

那么,如何调用控制器?

TheController.new.dispatch(:index, request)