2016-05-30 163 views
0

我想在沒有使用Ajax重新加載表單的情況下在字段的出口點擊數據庫。控制器必須對從數據庫獲得的數據進行一些處理並對視圖做出響應。用戶將繼續輸入。Ajax請求不工作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 

資產/ Java腳本/ 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是有,但我確實在路由一個POST:

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_matriculashow路線的:id部分。

要通過POST發送請求的URL,該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方法被調用,並且rails試圖從表中加載一個明顯不存在的記錄。我在控制檯看到一個GET,但是我在路由中做了一個POST: 對於127.0.0,開始GET「/ liquidaciones_de_viajes/check_matricula?liquidacion_de_viajes%5Bmatricula%5D = 5555」。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

l使用相同的代碼和GET在導軌3.2是好的,但不是在4.2中: rails 3.2.13 對於127.0.0.1在2016-05-30 16:00開始GET「/ liquidaciones_de_viajes/check_matricula?liquidacion_de_viajes%5Bmatricula%5D = 5555」 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年5月30日16時32分: 05 -0300 LiquidacionesDeViajesController處理#顯示爲JSON –