Necesito enviar datos a través de JS a un controlador Laravel con un clic de botón. No estoy usando ningún formulario porque los datos se crean dinámicamente. Cada vez que intento enviar los datos, aparece un Error interno del servidor (500), pero no puedo detectar esa excepción en el controlador o en el archivo laravel.log.
Esto es lo que estoy haciendo:
Ruta:
Route::post('section/saveContactItems', 'SectionController@saveContactItems');Controlador:
public function saveContactItems($id, $type, $items, $languageID = "PT"){ ... }JS:
$('button').on("click", function (evt) { evt.preventDefault(); var items = []; var id = $("#id").val(); var languageID = $("#languageID").val(); var data = { id: id, type: type, items: JSON.stringify(items), languageID: languageID }; $.ajax({ url: "/section/saveContactItems", type: "POST", data: data, cache: false, contentType: 'application/json; charset=utf-8', processData: false, success: function (response) { console.log(response); } }); });¿Qué estoy haciendo mal? ¿Cómo puedo lograr esto?
ACTUALIZACIÓN: Gracias a la respuesta de @ShaktiPhartiyal (y la ayuda de @Sanchit) pude resolver mi problema. En caso de que alguien más tenga un problema similar, después de seguir la respuesta de @Shakti, no pude acceder a los datos en el controlador. Entonces, tuve que ordenar los datos antes de enviarlos al servidor:
data: JSON.stringify(data),No necesitas usar
public function saveContactItems($id, $type, $items, $languageID = "PT"){ ... }Tienes que hacer lo siguiente:
public function saveContactItems() { $id = Input::get('id'); $type = Input::get('type'); $items = Input::get('items'); $languageID = Input::get('languageID'); }y sí, como sugirió @Sanchit Gupta, debe enviar el token CSRF con la solicitud:
Métodos para enviar token CSRF en AJAX:
$.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });Si utiliza este enfoque, debe establecer una metaetiqueta como esta:
<meta name="csrf-token" content="{{csrf_token()}}">o
data: { "_token": "{{ csrf_token() }}", "id": id }ACTUALIZAR
como @Sanchit Gupta señaló, use la fachada de entrada así:
use Input;