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

这听起来很奇怪,但是听我说……我需要能够向我的其他控制器发出相应的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 

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

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

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

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

例如,如果您正在创建一个Person:

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

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

 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 

我希望这可以帮助一点。 🙂