0

I thought this would be straightforward since I constantly use AJAX to update models via an actual form that exists in the DOM but when trying to send a JSON object I am running into problems trying to get it to work.

I know there are a lot of similar questions but none seem to be concrete in terms of what the JavaScript should be and how the request should be parsed by the controller, I have tried every variation I can think of but I still can't retrieve the data from the request.

JS

var form_data = JSON.stringify(quote);

$.ajax({
    url: '/quotes/save_draft',
    data: { params: form_data },
    type: 'POST',
    contentType: 'application/json',
    cache: false,
    success: function(data) {

    },
    error: function() {

    }
});

For the data attribute I have tried

data: { params: form_data },
data: form_data,
data: quote,

Rails Controller

RAILS_DEFAULT_LOGGER.info params.inspect
RAILS_DEFAULT_LOGGER.info params[:_json].inspect

but I still can't get a property of the original JSON object to print successfully, e.g. RAILS_DEFAULT_LOGGER.info params[:_json][:params][:payment_term], with [:params] being the top level attribute of the JSON object.

The output of RAILS_DEFAULT_LOGGER.info params[:_json][:params][:payment_term] looks like a url encoded string rather than a JSON object but if I try using JSON.parse(params[:_json]) I just get an an error which is TypeError (can't convert String into Integer).

Any ideas? I know it must be some combination of what I have above and I'm sure I've tried them all but I must not have or I'm trying something completely irrelevant.

Full Controller

def save_draft
  if request.post?
    RAILS_DEFAULT_LOGGER.info "\n\n"
    RAILS_DEFAULT_LOGGER.info params
    RAILS_DEFAULT_LOGGER.info params[:_json]
    RAILS_DEFAULT_LOGGER.info params[:_json][:form_data]
    RAILS_DEFAULT_LOGGER.info params[:_json][:form_data][:payment_term]
    RAILS_DEFAULT_LOGGER.info "\n\n"

    render :text => '1'
  else
    render :text => '0'
  end
end

The current error from that is to do with the RAILS_DEFAULT_LOGGER.info params[:_json][:form_data] line, it's a no method error because of a nil object.

This is the output of RAILS_DEFAULT_LOGGER.info params.inspect

{"action"=>"save_draft", "_json"=>"form_data=%7B%22line_items%22%3A%5B%7B%22contract_term%22%3A12%2C%22product%22%3A%222-Pair+EFM+off-net%22%2C%22site%22%3Anull%2C%22quantity%22%3A1%2C%22setup_cost_each%22%3A1500%2C%22setup_cost%22%3A1500%2C%22rental_cost_each%22%3A240%2C%22rental_cost%22%3A240%2C%22is_ad_hoc%22%3Afalse%2C%22default_setup%22%3A1500%2C%22default_rental%22%3A240%2C%22default_contract%22%3A12%2C%22fixed_initial_cost%22%3Afalse%2C%22price_list_item_id%22%3A194%2C%22info%22%3A%22Provides+up+to+10Mb%2Fs+of+symmetric+Ethernet+connectivity+with+a+6-hour+fix+SLA.%22%7D%5D%2C%22partner_id%22%3A125%2C%22raised_by%22%3A940%2C%22approval_required%22%3A0%2C%22payment_term%22%3A%22Monthly%22%2C%22message%22%3A%22%22%2C%22scope_of_work%22%3A%22%22%2C%22internal_message%22%3A%22%22%2C%22partner_ref%22%3A%22%22%2C%22ccs%22%3A%22%22%2C%22project_requires_coordination%22%3A0%7D", "controller"=>"quotes"}
12
  • Just use simple data: { form_data : form_data }. Can you please post your controller? Commented Jul 20, 2015 at 13:40
  • it is just a guess but give it a try: change contentType: 'application/json' to `contentType:"application/json; charset=utf-8", dataType:"json",' Commented Jul 20, 2015 at 13:40
  • Thanks for the suggestions, I've implemented both, the controller is quite simple for now, I've updated the question. Commented Jul 20, 2015 at 13:45
  • what if you simply log this params[:params] Commented Jul 20, 2015 at 13:48
  • @Athar - it just seems to be blank. I think you only get the _json hash when using the application/json content type Commented Jul 20, 2015 at 13:51

1 Answer 1

2

try this

$.ajax({
    url: '/quotes/save_draft',
    data: quote,
    type: 'POST',
    cache: false,
    success: function(data) {
      #your call 
    },
    error: function() {
      #show error
    }
});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.