Reputation: 434
I'd like to map the default AngularJS $resource actions:
'get': {method:'GET'}
'save': {method:'POST'}
'query': {method:'GET', isArray:true}
'remove': {method:'DELETE'}
'delete': {method:'DELETE'}
to these 5 Rails RESTful routes:
'show': {method:'GET'} -> get
'create': {method:'POST'} -> save
'update': {method:'PUT'} -> save
'index': {method:'GET', isArray:true} -> query
'delete': {method:'DELETE'} -> remove or delete
Everything maps well except for save
. It works on create
as a POST
request. But I'd like to change it to a PUT
request when I'm saving a resource that has an id != null
# 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()
]
I would ultimately like to modify the the submitted params as well so that I can namespace them to the default rails nested params i.e. params[:message]
rather than attaching them directly to the root params
string, but first I need to know how best to modify the the $resource.
Upvotes: 3
Views: 1914
Reputation: 1985
Off the top of my head, how about this 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::save = ->
if @id?
@update()
else
@create()
Message
]
Upvotes: 1