Rails Example (original) (raw)
Angular Code :
So here I am using Rails 4 with paperclip for attachments.
Showing below is the upload code for controller in Angularjs
// it's better to describe which file this code should be saved like; // app/assets/javascripts/blabla1.js for (var i = 0; i < $files.length; i++) { var file = $files[i]; $scope.upload = Upload.upload({ url: 'server/upload/url', method: 'POST', data: mydata,//it is the data that's need to be sent along with image file: file, fileFormDataName: 'myEntity[image]',//myEntity is the name of the entity in which image is saved and image is the name of the attachment formDataAppender: function(fd, key, val) { if (angular.isArray(val)) { angular.forEach(val, function(v) { fd.append('myEntity['+key+']', v); }); } else { fd.append('myEntity['+key+']', val); } } }); }
so, here my aim is to save data in a model with the attachment fields in it as per paperclip. Let us consider I want to save user with his image and the respective model is defined as
probably a scene from db/schema.rb:
Table : User user_id : integer name : string # other fields related to attachment are being # merged by using paperclip migration
so we can change the AngularJs controller code as
// if i'm not wrong, this should be same as blabla1.js: for (var i = 0; i < $files.length; i++) { var file = $files[i]; $scope.upload = Upload.upload({ url: 'server/upload/url', method: 'POST', data: {name : $scope.name}, file: file, fileFormDataName: 'user[image]', formDataAppender: function(fd, key, val) { if (angular.isArray(val)) { angular.forEach(val, function(v) { fd.append('user['+key+']', v); }); } else { fd.append('user['+key+']', val); } } }); }
Here I save the attachment with name imageLets have a look on our controller code for Rails :
let me guess, /app/controllers/user_controller.rb:
class UserController < ApplicationController
def saveUser
@user = Hotel.new(user_params)
if @user.save
render json: {success: true}
else
render json: @user.errors
end
end
private def user_params params.require(:user).permit(:name, :image) end end
Thats it, We are done.
Rails 4 and Angular File Upload 3 :
In the newest version of Angular File Upload (version 3 at the time of this writing), you should now use the fields
options to send extra attributes, so you no longer need to use formDataAppender
. To use the example above, this is how it should looks like now :
$scope.upload = function (files) { for (var i = 0; i < files.length; i++) { var file = files[i]; $scope.upload = Upload.upload({ url: 'server/upload/url', method: 'POST', fields: { 'user[name]': $scope.name }, file: file, fileFormDataName: 'user[image]' }); } }
NOTE : This works on CarrierWave, Paperclip and Dragonfly as far as I could test.