使用AngularJS在Rails中检索嵌套资源

Dre*_*rew 5 ruby-on-rails angularjs

我一直在基于Railscast作为起点,将AngularJS实现到我的Rails应用程序中.我的问题类似于这个问题:使用嵌套资源的Angular JS ngResource,但是我没有找到解决问题的方法.

目前我有一个嵌套资源,我通过部分显示在父资源的视图上.我需要在查询中提供project_id以检索任务,所以我有:

app.factory "Task", ["$resource", ($resource) ->
  $resource("/projects/:project_id/tasks/:id", {project_id: "@project_id", id: "@id"}, {update: {method: "PUT"}})
]

@TaskCtrl = ["$scope", "Task", ($scope, Task) ->
  $scope.tasks = Task.query({project_id: "@project_id", id: "@id"})
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何在视图中设置"@project_id",以便在我的示例的最后一行中可以在控制器中访问该值?我尝试使用ng-init:

<div ng-controller="TaskCtrl" ng-init="project_id = <%= @project.id %>">
Run Code Online (Sandbox Code Playgroud)

但是,在我的TaskCtrl控制器中,'project_id'为空,而'$ scope.project_id'也不起作用.任何帮助表示赞赏.

Oli*_*ver 5

ng-init在模板执行之前运行,而不是在控制器init之前运行.如果只有模板知道project_id,则创建一个共享服务(它可以是一个简单的值工厂),它保存项目ID并将其注入控制器.您可以从TaskController之前初始化的另一个控制器填充该服务

<div ng-controller="ProjectIDController">
    <span ng-init="project_id = <%= @project.id %>"></span>
</div>

<div ng-controller="TaskCtrl">
    ...
</div>

function ProjectIDController( $scope, sharedService ) {
    $scope.$watch('project_id', function (UID) {
        sharedService.setProjectID($scope.project_id);
    });
}

function TaskCtrl ($scope, Task, sharedService) {
    $scope.tasks = Task.query({project_id: sharedService.getProjectId()... 
}
Run Code Online (Sandbox Code Playgroud)

抱歉没有咖啡......