Rails Ajax, данные об успешном обратном вызове не определены

Так что я довольно новичок в Rails.

Вот моя проблема:

У меня есть вызов Ajax в моем coffeescript для модели Tenant, страница редактирования.

$("#tenant_tenantbuildinginfo").change ->
    $.ajax
        url: "/buildings/getgst",
        dataType: "json",
        data: 'buildinginfo' : $(this).val(),
        success: (data) ->
            console.log data
            $("#tenant_gst").val data
        error: (data) ->
            console.log 'error'
    return false

Таким образом, идея этого ajax-вызова состоит в том, чтобы вернуть налоговую ставку, например «5,6», из метода в контроллере зданий (который отлично работает)...

   def getgst
     d { 'gets fired' }
     s = Building.get_gst_for_building(params[:buildinginfo])
     d { s.to_s('F') }
     @var = s.to_s('F')

     respond_to do |format|
       format.json { render json: @var }
     end

   end

Строки d { } - это регистратор, поэтому я знаю, что функция вызывается и возвращает правильное значение. Так что прекрасно, вызов Ajax работает отлично до сих пор. Однако теперь моя проблема заключается в анализе или отображении возвращаемого значения в функции успеха.

success: (data) ->
console.log data
$("#tenant_gst").val data

Эта часть вызова AJAX возвращает «undefined» в моей консоли, что действительно странно, потому что в моем действии контроллера я визуализирую @var в json, а вызов ajax ожидает json.

Любая помощь приветствуется, большое спасибо!


person msadoon    schedule 17.06.2014    source источник


Ответы (1)


undefined означает, что переменная данных не определена. Прежде всего, формат json предполагает, что вы вернете ответ в формате ключ: значение, поэтому вам лучше использовать, например:

format.json { render json: { "gst": @var } } в ответе контроллера

Вы неправильно используете coffeescript, потому что методы успеха и ошибки передаются в переменную данных, вы можете попробовать и проверить, как он анализируется в JS, здесь: http://js2coffee.org/

То, что вы, вероятно, имели в виду, было

$("#tenant_tenantbuildinginfo").change ->
    $.ajax
        url: "/buildings/getgst",
        dataType: "json",
        data: 'buildinginfo' : $(this).val()
        success: (data) ->
            console.log data
            $("#tenant_gst").val data
        error: (data) ->
            console.log 'error'
    return false

(обратите внимание на отсутствие запятой в конце строки $("#tenant_gst").val data)

Во-вторых, я бы предпочел попробовать цепочку методов при обращении к ответам об ошибках/успешных результатах в вызове jQuery.:

$("#tenant_tenantbuildinginfo").change ->
  $.ajax(
    url: "/buildings/getgst"
    dataType: "json"
    data:
      buildinginfo: $(this).val()
  ).success( (data) ->
      console.log data
      $("#tenant_gst").val data
  ).error( (data) ->
      console.log "error"
  )
person konole    schedule 17.06.2014
comment
эй, я попробовал ваши советы, но теперь метод rails не вызывается, и я получаю GET localhost:3000/buildings/ 500 (внутренняя ошибка сервера) responseText: ‹header›↵ ‹h1›↵ SyntaxError↵ in BuildingsController#getgst↵ ‹/h1›↵‹/header›↵↵‹div id= container›↵ ‹h2›/Users/mubi/Desktop/JR Buildings/jrbuilding/app/controllers/buildings_controller.rb:22: синтаксическая ошибка, неожиданное ':', ожидание =↵ - person msadoon; 17.06.2014
comment
Привет, извините за мою ошибку, конечно, я имел в виду: format.json { render json: { gst: @var } } Символ ноты вместо строки для gst. Если бы вы использовали строку, то "gst" => @var BTW. Используйте более осмысленные имена, чем @var. @ уже означает переменную :) Используйте, например. простой @gst - person konole; 19.06.2014