JSON response , error message

Hello

I am trying to show the errors that can occur by uploading a file (file

name, size).

I need have your error messages associated to the ‘error’ key in my json response

else

format.html { render action: “new” }

format.json { render json: @upload.errors, status:

:unprocessable_entity }

end

my validations:

validates_uniqueness_of :upload_file_name, :message => "File with

this name is already in the database"

validates :upload_file_size, :inclusion => {:in

=>10.megabytes…20.megabytes}, :message =>“Too big or too small”

def to_jq_upload

{

“name” => read_attribute(:upload_file_name),

“size” => read_attribute(:upload_file_size),

“url” => upload.url(:original),

“delete_url” => upload_path(self),

“delete_type” => “DELETE”

}

end

end

I have tried: format.json { render json: => [{:error=> @upload.errors.full_messages }] }

using this shows the validation message but I need the status: to be there as well

render json: {error: @upload.errors.full_messages}, status: :unprocessable_entity

shows no error messages at all


render json: {error: @upload.errors.full_messages}, status: :unprocessable_entity 
 I get an error-text : Internal Server Error and not what stands in my validation messages

Thanks in advanced

in your controller:

render :json => { :errors => @example.errors.full_messages }, :status => 422

in your js file:

$(‘.form_id_or_class’).live(‘submit’, function() {

$.ajax({

url: $(this).attr(“action”),

type: “POST”,

data: $(this).serialize(),

success: function(data) {

// do some action

}

,error: function(xhr){

var errors = $.parseJSON(xhr.responseText).errors

}

});

return false;

});

Why are you sending a 422? If you really want to stick in the 400 range it would be more suitable to send a 409 conflict since it literally is a conflict but some just prefer to stick to a generic 500.

in your js file:

$('.form_id_or_class').live('submit', function() {
  $.ajax({
    url: $(this).attr("action"),
      type: "POST",
      data: $(this).serialize(),
      success: function(data) {
       // do some action
    }
    ,error: function(xhr){
      var errors = $.parseJSON(xhr.responseText).errors
    }
  });
  return false;
});

The only js script i have there is the following and it is in the index.html.erb. I am using this example for File uploader in Ruby on Rails.

Should I just add your code to mine or mine code has to be modified?

422 is the recommended behavior from respond_with and friends:

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/responder.rb#L259

409 seems odd, given that the error could be “file too large” which isn’t really “a conflict with the current state of the resource” as described in the RFC.

Also note that returning a 422 causes ActiveResource to behave in an expected manner (failing a save rather than raising an exception), which may-or-may-not be relevant for this use case.

–Matt Jones