如何运行另一个控制器的创建操作

时间:2011-12-06 09:40:01

标签: ruby-on-rails controller action

我正在研究带有rails的iphone应用程序的后端。这是我第一个使用rails的真实项目。

这个应用程序是一种项目管理应用程序。在应用程序中,人们可以创建用户帐户,同时他们可以选择创建第一个项目。因此,当用户提交他们的信息时,我的用户控制器会收到包含用户信息和项目信息的params的发布请求。

所以我现在正在做的是存储数据库中所有属性的用户信息,但我也检查params是否包含任何项目信息,如果是,我想运行项目控制器的创建操作。

我知道这可以通过运行两个单独的post请求或通过在用户模型和项目模型之间建立关联然后从用户控制器运行Project.create来完成,但是因为我认为这种方式基本上重复了项目的内容无论如何我应该创建动作,我想保持干燥,只是以某种方式运行项目控制器的创建动作。

这可能在rails中吗?至少可以使用php和zend。

3 个答案:

答案 0 :(得分:0)

如果您有要在控制器之间共享的代码,您可能希望将其提取到模块并将其“混合”作为包含。

module SkyBlue
  def make_blue
   @my_colour = "blue"
  end
end

class Foo
  include SkyBlue

  def initialize
    @my_colour = "Foo coloured"
  end

  def my_colour
    @my_colour
  end
end

class Bar
  include SkyBlue

  def initialize
    @my_colour = "Bar coloured"
  end

  def my_colour
    @my_colour
  end
end

然后你可以看到“混合”模块的效果:

f = Foo.new
f.my_colour # => "Foo coloured"
f.make_blue
f.my_colour # => "blue"

b = Bar.new
b.my_colour # => "Bar coloured"
b.make_blue
b.my_colour # => "blue"

答案 1 :(得分:0)

你不应该这样做。

Skinny控制器意味着控制器动作的代码应该很小。

使用各种控制器操作是可能的,实际上可能会使特定操作的代码变小,但需要权衡。你正在增加耦合。您正在使操作的代码依赖于另一个控制器。

永远不要那样做。如果你的控制器需要做一些也由其他控制器完成的事情,那就没问题。想想像用例这样的行为,但可能有类似的行为,但它们可能没有关系。

简单地抽象一个帮助方法,抽象是有意义的。

答案 2 :(得分:-1)

只需尝试通过ControllerName.new(env).create调用它,看看会发生什么; - )