1

I am having issues with making an ajax request to my controller. Here is my code:

 $.ajax({
                type:"POST",
                async: true,
                cache: false,
                url:"<?php echo \Cake\Routing\Router::url(array('controller'=>'Organizations','action'=>'add', 'ext' => 'json'));?>",
                beforeSend: function(xhr) {
                    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
                },
                success: function(tab){
                    $( "#users acronymTable" ).append( "<tr>" +
                        "<td>" + acronym.val() + "</td>" +         
                        "<td>" + definition.val() + "</td>" +
                      "</tr>" );
                },
                error: function (tab) {
                    alert('error' + tab.statusText);
                }
            });

MyController.php:

class OrganizationsController extends AppController
{

    public function initialize(){
         parent::initialize();
        $this->loadComponent('RequestHandler');
    }
 public function add()
    {
        $this->layout = null;

        if ($this->request->is('post')) {

        // result can be anything coming from $this->data
        $result =  'Hello Dolly!';
        $this->set("result", $result);        

        }
    }
}

The problem is that this does not return a string but returns an error page. If I view the error page, the error is:

Missing Template: Error: The view for OrganizationsController::add() was not found.

While it is true that there is no add.ctp file, it should not be trying to find a view to return, as I only want it to return a single string. Am I missing a setting somewhere?

thanks

1
  • Either use Ajax plugin, or follow the documentation on how to serve view less via _serialize and JsonView. Commented Apr 22, 2017 at 12:45

2 Answers 2

2

You need to have a view that the $result should be sent to. If you don't want a view turn off auto rendering $this->autoRender = false;, otherwise create an add.ctp or declare a different view with $this->render('other_view');

As noted by ndm

Always either render a template, use a serialized data view, or prepare and return a response object

Sign up to request clarification or add additional context in comments.

2 Comments

Please, never echo data in a controller! This will mess up the testing environment, and header problems are likely too. Always either render a template, use a serialized data view, or prepare and return a response object!
Yes, in this case, I do not want to create a view, as I simply want to return a data object (json). Adding the $this->autoRender = false; worked but how should I return my data object?
-1

Use instead of

$this->layout = null; 

Try

$this->render(false);

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.