【问题标题】:How to run another controller's create action如何运行另一个控制器的创建操作
【发布时间】:2011-12-06 09:40:01
【问题描述】:

我正在使用 Rails 开发 iphone 应用程序的后端。这是我第一个使用 Rails 的真正项目。

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

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

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

这在 Rails 中可能吗?至少在 php 和 zend 中是可能的。

【问题讨论】:

    标签: ruby-on-rails controller action


    【解决方案1】:

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

    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"
    

    【讨论】:

      【解决方案2】:

      你不应该那样做。

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

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

      永远不要那样做。如果你的控制器需要做一些其他控制器也做的事情,那没关系。想想用例之类的动作,但可能有相似之处,但它们可能不相关。

      只要抽象成一个辅助方法,抽象就有意义。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多