Rails:如何在内部POST到另一个控制器动作?

时间:2012-05-14 23:30:15

标签: ruby-on-rails

这听起来很奇怪,但是听我说......我需要能够向我的其他控制器发出相应的POST请求。 SimpleController基本上是更详细的控制器的简化版本。我该怎么做呢?

class VerboseController < ApplicationController
  def create
    # lots of required params
  end
end

class SimpleController < ApplicationController
  def create
    # prepare the params required for VerboseController.create
    # now call the VerboseController.create with the new params
  end
end

也许我过度思考这个问题,但我不知道该怎么做。

2 个答案:

答案 0 :(得分:7)

Rails应用程序(或任何遵循相同模型 - 适配器 - 视图模式的Web应用程序)中的控制器间通信是您应该主动避免的。当你想要这样做时,请考虑一个标志,你正在与你的应用程序构建的模式和框架作斗争,并且你依赖于逻辑已经在应用程序的错误层实现。

正如@ismaelga在评论中所说的那样;两个控制器都应该调用一些通用组件来处理这种共享行为并保持控制器“瘦”。在Rails中,它通常是模型对象的一种方法,特别是对于在这种情况下你似乎担心的那种创建行为。

答案 1 :(得分:3)

你不应该这样做。你在创建一个模型吗?然后在模型上有两个类方法会好得多。它还可以更好地分离代码。然后,您不仅可以在控制器中使用这些方法,还可以在将来使用后台作业(等)。

例如,如果您正在创建人员:

class VerboseController < ApplicationController
  def create
    Person.verbose_create(params)
  end
end

class SimpleController < ApplicationController
  def create
    Person.simple_create(params)
  end
end

然后在人物模型中你可以这样:

class Person
  def self.verbose_create(options)
    # ... do the creating stuff here
  end

  def self.simple_create(options)
    # Prepare the options as you were trying to do in the controller...
    prepared_options = options.merge(some: "option")
    # ... and pass them to the verbose_create method
    verbose_create(prepared_options)
  end
end

我希望这可以帮助一点。 : - )