Rails AngularJS多态最佳实践

时间:2014-01-29 07:01:20

标签: ruby-on-rails angularjs design-patterns

我有一个rails多态模型“Task”。将有许多具有“任务”的不同模型。现在我有一个模型“患者”,我需要为每个患者提取分配给他们的任务,将它们放在每个患者索引页面上,然后使用角度处理该页面内任务的粗略动作。这是我一直在进行的内部斗争。我可以看到两种截然不同的方式,我不确定哪种方式被认为是最佳设计实践:

  1. 将会有许多具有任务的rails对象,因此任务应该保留所有逻辑,并解释对象要求执行的任务。会有一个角度的TasksController,它将通过您所在的页面知道,您正在处理的“任务”对象是什么。然后,它将查询tasks_controller以提取与该可任务对象相关的所有任务。对于每个crud操作,任务对象和资源将处理数据。

  2. 每个对象(在本例中为每个患者)通过关联(patient.tasks)知道它具有哪些任务,因此逻辑应该流经任务对象。在角度中,将有一个PatientController将找到当前患者,然后在rails中查询patients_controller,并返回分配给该患者的相关任务。对于每个crud操作,患者对象和资源将处理数据。

  3. 现在我已经选择了1.这是我的TasksController.js:

    BC.controller('TasksController', ['$scope', 'TaskResource', function($scope, TaskResource){
      $scope.init = function(taskableId, taskableType, currentUserId) {
        $scope.task = {};
        $scope.task.taskableId = taskableId;
        $scope.task.taskableType = taskableType;
        $scope.task.creatorId = currentUserId;
    
        TaskResource.query({taskable_id: $scope.task.taskableId, taskable_type: $scope.task.taskableType}).then(function(result){
          $scope.tasks = result.reverse();
        });
      };
    
     $scope.taskCreate = function($event, task){
       $event.preventDefault();
       new TaskResource({text: task.text, taskableType: task.taskableType, taskableId: task.taskableId, creatorId: task.creatorId})
       .create().then(function(result){
         $scope.tasks.unshift(result);
         $scope.task.text = '';
       });
     };
    }]);
    

    我有一个init函数,我传递了我所在页面的taskable_id和taskable_type,以便从tasks_controller和Task模型中查询正确的任务。这目前正在工作,但我开始看到一些可能的设计问题,并且不禁觉得这可能是一个糟糕的设计实践。任何有关这方面的帮助/想法将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

简答

简短的回答,第一个选项符合'标准练习',是更好的选择。最佳实践始于如何您实施此标准实践 - 或前端 - 后端应用程序中出现的标准需求

长答案

选择相当于降低成本并在未来轻松改变的解决方案

一旦确定了标准做法 - 如何最好地安排Angular< =>的通信。 Rails,寻求最佳实践,应该如何开始。有许多方法可以采取。 Restangular,角度低级别$http,角度级别ngResource或特定于Rails的方法 - angularjs-rails-resource。这些都有效,还有更多。

但你正在使用其中之一,这不是你的问题。这里要问的一个微妙的问题不是这些方法应该用什么方法来谈,而是他们应该以什么方式交谈。这种情况下的最佳实践实际上是由一系列指导而非规则决定的。这些指导方针规定,最佳解决方案可能对您自己的应用程序而言有些独特,而且所有这些都是为了充分利用您所选择的每项选择的成本。

问题是在应用程序的早期阶段,我们从未真正了解实际成本。作为桑迪梅斯“你永远不会知道你现在做的事情”。所以,我建议在开始阶段,任何时候你面临这样的决定,做最多利用你的API。而不是在Angularjs中做任何形式的想法,将数据传递给Rails API并让它弄清楚。在这个级别,您将需要使用疼痛驱动的开发 - 聆听应用程序的痛苦。当事情变得艰难时,退后一步,看看是什么导致疼痛。听听痛苦。当出现问题时,它会告诉你。

使用SOLID原则构建公共接口

这个概念从SOLID面向对象设计中茁壮成长。它的要点是制作易于更改的应用程序的指南,以Angular所说的方式运行*“Hello Rails API,我知道你有我想要的东西,我相信你会把它归还给我”而不是说*“Hello Rails,我知道你有我想要的东西,我知道你需要怎样才能得到它”哪个只比最坏的情况好一点,“你好,Rails先生。我知道你有我想要的,我知道什么我想,我知道如何得到它。“

Sandi Metz在她的“Ruby中的实用面向对象设计”一书中对此进行了最佳解释。第4章很好地解释了它。在该章中,您处理对象的公共接口(API),并且在此问题中您指的​​是 Rails 应用程序的实际公共接口(API),一旦你看过Rails应用程序的表面层,你最终会处理一个对象接口,因为最后你可能最终会在你的控制器中调用一个方法, 对象适用公共接口。

代码比单词更响亮,如果其中一些没有意义,发布更多代码,我们可以尝试在代码中解释这个,这比单词更容易理解:)

修改:我打算再次解决这个问题,看看我是否无法以更易于理解的方式对其进行重组