2016-05-30 4 views
0

Я пытаюсь попасть в базу данных на выходе из поля без перезагрузки формы с помощью Ajax. Контроллер должен выполнить некоторый процесс по данным, полученным из базы данных, и отреагировать на представление. Затем пользователь продолжит ввод.Ajax request not work rails 4

Я что-то упускаю и просто не вижу, что не так. У меня есть тот же кусок кода, который работает в приложении Rails 3.2 без проблем. В Rails 3.2 запрос переходит к методу check_matricula, но в Rails 4 он переходит в действие show.

Следующий код не работает в моей Rails 4 приложения:

Gemfile

gem 'responders', '~> 2.0'

Посмотреть

<div class="field"> 
    <%= f.text_field :matricula, { "data-remote" => true, "data-url" => "/liquidaciones_de_viajes/check_matricula", "data-type" => :json, :size => 10 } %> 
    <span id="check_matricula">&nbsp;</span> 
</div> 

Контроллер

class LiquidacionesDeViajesController < ApplicationController 
     respond_to :html, :json 

    def check_matricula 
    @matricula = Matricula.find_by_codigo(params[:liquidacion_de_viajes][:matricula]) 

    # ... some process that result in matricula_ok true or false ... 

    if matricula_ok 
     respond_with(@matricula.empresa.razon_social) 
    else 
     respond_with(nil) 
    end 
    end 
end 

активы/JavaScripts/check_matricula.js

$(document).ready(function() { 
    $("#liquidacion_de_viajes_matricula").bind('ajax:success', function(evt, data, status, xhr) { 
     if (data !== null) { 
      $('#razon_social').html(data.razon_social); 
      $('#check_matricula').html(''); 
     } else { 
      $('#check_matricula').html('Error de matricula'); 
      $('#razon_social').empty(); 
     } 
    }); 

    $("#liquidacion_de_viajes_matricula").live('ajax:before', function() { 
     if ($(this).val() == '') { 
      return false; 
     } 
    }); 

    $("#liquidacion_de_viajes_matricula").focus(function() { 
     $('#check_matricula').empty(); 
     $('#razon_social').empty(); 
    }); 
}); 

я вижу в консоли GET находится там, но я сделал сообщение в маршруте:

Started GET "/liquidaciones_de_viajes/check_matricula?liquidacion_de_viajes%5Bmatricula%5D=5‌​555" for 127.0.0.1 at 2016-05-30 15:00:50 -0300 
Processing by LiquidacionesDeViajesController#show as JSON 
Parameters: {"liquidacion_de_viajes"=>{"matricula"=>"5555"}, "id"=>"check_matricula"} 
+0

Первый шаг, который я мог бы предложить вам в отладки для проверки запросов & ответов. Перейдите на страницу формы. Если вы используете Chrome, щелкните правой кнопкой мыши на странице и нажмите «Осмотреть». В инструментах разработчика, которые будут всплывать, нажмите вкладку «Сеть». Затем попробуйте ввести в свой 'f.text_field: matricula'. Затем вы должны заметить, что эти новые запросы появятся в этой панели инструментов разработчика. Нажмите этот запрос в инструментах разработчика, и появится новая панель. В этой боковой панели нажмите «Ответ». Затем проверьте правильность ответа. Если это не помогло, следующим шагом будет отладка JS или контроллера. –

ответ

0

Пожалуйста, измените ответ в Json

def check_matricula 
     @matricula = Matricula.find_by_codigo(params[:liquidacion_de_viajes][:matricula]) 

    ... some process that result in matricula_ok true or false ... 

     if matricula_ok 
     respond_to do |format| 
      format.html 
      format.json{ 
      render :json => @matricula.empresa.razon_social.to_json 
      } 
     end 

     else 
      respond_with(nil) 
     end 
    end 
0

Вам просто нужно указать check_matricula маршрут для регулятора,:

resources : liquidaciones_de_viajes do 
    collection do 
    post `check_matricula` 
    end 
end 

Без этого маршрута, Rails предполагает, что check_matricula является :id часть show маршрута.

Чтобы отправить запросы на URL с помощью POST, добавьте параметр data-method: :post к вашему text_field, например, так:

<%= f.text_field :matricula, { data-remote: true, data-url: "/liquidaciones_de_viajes/check_matricula", data-type: :json, data-method: :post, size: 10 } %> 
+0

Я сделал маршрут, но проблема сохраняется; вызывается метод show, и рельсы пытаются загрузить явно несуществующую запись из таблицы. Я вижу в консоли GET, но я сделал POST на маршруте: Начато GET "/ liquidaciones_de_viajes/check_matricula? Liquidacion_de_viajes% 5Bmatricula% 5D = 5555" для 127.0.0.1 в 2016-05-30 15:00:50 -0300 Обработка LiquidacionesDeViajesController # показать как JSON Параметры: {"liquidacion_de_viajes" => {"matricula" => "5555"}, "id" => "check_matricula" } –

+0

@RaulLopez Я обновил ответ и добавил метод POST к 'text_field'. Это заставит запрос перейти к 'POST check_matricula' вместо' GET show'. –

+0

lUsing же код и GET в рельсах 3.2 в порядке, но не в 4.2: рельсы 3.2.13 Начато GET "/ liquidaciones_de_viajes/check_matricula? Liquidacion_de_viajes% 5Bmatricula% 5D = 5555" для 127.0.0.1 в 2016-05-30 16: 27:58 -0300 Обработка LiquidacionesDeViajesController # check_matricula в формате JSON рельсы 4.2.3 работы GET "/ liquidaciones_de_viajes/check_matricula liquidacion_de_viajes% 5Bmatricula% 5D = 6666?" для 127.0.0.1 на 2016-05-30 16:32: 05 -0300 Обработка LiquidacionesDeViajesController # показать как JSON –