扩展AngularJS $resource来映射Rails rest式路由(特别是$save来创建和更新)

Extend AngularJS $resource to map to Rails RESTful Routes (particularly $save to create AND update)

本文关键字:save 特别是 创建 更新 resource AngularJS 映射 Rails 扩展 rest 路由      更新时间:2023-09-26

我想映射AngularJS的默认$resource动作:

  'get':    {method:'GET'}
  'save':   {method:'POST'}
  'query':  {method:'GET', isArray:true}
  'remove': {method:'DELETE'}
  'delete': {method:'DELETE'}

到这5个Rails RESTful路由:

  'show':   {method:'GET'}                 -> get
  'create': {method:'POST'}                -> save
  'update': {method:'PUT'}                 -> save
  'index':  {method:'GET', isArray:true}   -> query
  'delete': {method:'DELETE'}              -> remove or delete

除了save,其他都映射得很好。它作为POST请求在create上工作。但是,当我保存具有id != null

的资源时,我想将其更改为PUT请求。
# This factory needs a smarter $save() method
myServices.factory 'Message', ['$resource', ($resource) ->
    Message = $resource "api/users/:user_id/messages/:id",
        user_id: '@user_id'
        id: '@id'
    ,
        # update should not be needed
        update:
            method: 'PUT'
    Message
]

myApp.controller "UsersShowCtrl", ["$scope", "$routeParams", "User", "Message", ($scope, $routeParams, User, Message) ->
    $scope.user = User.get({id: $routeParams.user_id})
    $scope.myMessage = new Message {user_id: $routeParams.user_id}
    $scope.submitMyMessage = ->
        # This should just be:
        # $scope.myMessage.$save()
        # rather than:
        unless $scope.myMessage.id?
            $scope.myMessage.$save()
        else
            $scope.myMessage.$update()
]

我最终想修改提交的参数以及,以便我可以命名空间他们默认的rails嵌套参数即params[:message],而不是将它们直接附加到根params字符串,但首先我需要知道如何最好地修改$resource。

在我的脑海中,这个save()方法如何?

myServices.factory 'Message', ['$resource', ($resource) ->
    Message = $resource "api/users/:user_id/messages/:id",
        user_id: '@user_id'
        id: '@id'
    ,
        # update should not be needed
        update:
            method: 'PUT'
    Message::save = ->
        if @id?
            @update()
        else
            @create()
    Message
]