6

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

也许我想太多了,但我不知道该怎么做。

4

2 回答 2

7

Rails 应用程序(或任何遵循相同模型-适配器-视图模式的 Web 应用程序)中的控制器间通信是您应该积极避免的。当您想这样做时,请认为这表明您正在与构建应用程序的模式和框架作斗争,并且您所依赖的逻辑已在应用程序的错误层实现。

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

于 2012-05-14T23:54:19.713 回答
3

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

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

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

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

然后在 Person-model 中你可以这样:

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

我希望这能有所帮助。:-)

于 2012-05-14T23:55:42.890 回答