Halnex
Halnex

Reputation: 4526

Laravel 5: jQuery Typeahead gives error status 500 on page load (Missing argument)

Everything else works fine, when I search for a subreddit (category) and submit it to the database, no problem there.

But when I first load the post/create page, I get STATUS 500 on this route http://localhost/reddit/public/data/subreddits

I'm not sure what I've done wrong considering that it works.

routes

Route::get('data/subreddits', 'PostsController@getSubreddits');
Route::get('data/subreddits/{QUERY}', 'PostsController@getSubreddits');

PostsController.php

public function create()
{
    $subreddits = Subreddit::lists('name', 'id')->toArray();

    return view('post/create')->with('subreddits', $subreddits);
}

public function getSubreddits($query) {
        $results = Subreddit::select('id', 'name')->where('name', 'LIKE', '%' . $query . '%')->get();
        return Response::json($results);
}

Javascript in create.blade.php

<script type="text/javascript">
        $(document).ready(function() {
            var subreddits = new Bloodhound({
                datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                prefetch: 'http://localhost/reddit/public/data/subreddits',
                remote: {
                    url: 'http://localhost/reddit/public/data/subreddits/%QUERY',
                    wildcard: '%QUERY'
                }
            });

            $('#remote .typeahead').typeahead(null, {
                name: 'name',
                display: 'name',
                source: subreddits
            });

            $('#remote .typeahead').bind('typeahead:select', function(ev, suggestion) {
                $('.subreddit_id').val(suggestion.id);
            });
        });
    </script>

Error

Missing argument 1 for App\Http\Controller\PostsController::getSubreddits()

Upvotes: 2

Views: 544

Answers (2)

chanafdo
chanafdo

Reputation: 5124

As @mimo has answered you need to make your query a optional parameter.

Route::get('data/subreddits/{query?}', 'PostsController@getSubreddits');

Also you need to pass a default value to your query parameter in getSubreddits

public function getSubreddits($query = '') {
    $results = Subreddit::select('id', 'name')->where('name', 'LIKE', '%' . $query . '%')->get();
    return Response::json($results);
}

Also if there are only few results you can sent all the data if no query parameter is passed.

public function getSubreddits($query = '') {
    $q = Subreddit::select('id', 'name')
    if ($query) {
        $q->where('name', 'LIKE', '%' . $query . '%');
    }
    return Response::json($q->get());
}

Upvotes: 1

cre8
cre8

Reputation: 13562

Your first route has no parameter but you call a function that needs one. If you delete the row the error should be removed.

Route::get('data/subreddits/{QUERY?}', 'PostsController@getSubreddits');

Will call the function even when there is no query.

Upvotes: 0

Related Questions