重构控制器


Refactoring controllers

我对限制重复代码的控制器结构有一些疑问。

例如,我想找回男人和女人。执行此操作的最佳方法是什么:

class User {
   public function men() {
       //render
   }
   public function women() {
       //render
   }
   //OR
   public function by_type($type) {
       //render
   }
}

这是一个简单的例子,但类型的数量可能会增加。每种类型都可以有单独的视图。我正在寻找未来的扩展解决方案。此用例的最佳做法。

谢谢

Rails有一个(有点争议的)原理,叫做胖模型,瘦控制器,这基本上意味着你可以使用控制器来处理视图的逻辑,并让模型处理所谓的"繁重工作"。


蛋糕 PHP/导轨

要从 CakePHP 移植到 Rails,我强烈建议您尽可能多地使用这些模型,因为它允许您创建一个利用服务器完整性能结构的应用程序,而不是像许多人使用 CakePHP 那样将所有逻辑留在控制器中。

专门针对您的问题:

#app/controllers/users_controller.rb
def index
    @user = User.gender(params[:gender])
end
#app/models/user.rb
def self.gender(type)
    where?("type = ?", type)
end

这使您可以使控制器尽可能薄,从而允许在整个应用程序中正确分发代码

我认为Rails与CakePHP有很大不同,因为它可以帮助您创建真正实用且内容丰富的应用程序,这些应用程序利用整个服务器,而不仅仅是提供一个层来使网站动态

化。

据我了解您的问题,您可以通过以下方式调用真正在by_type函数中呈现类型的函数:

public function by_type($type) {
    if (method_exist($this, $type) {
        return call_user_func(array($this, $type));
    }
    else {
        throw new Exception('method do not exists!');
    }
}

这样,您只需编写呈现类型的方法并使用by_type方法调用它。