2012-04-16 2 views
0

Я пытаюсь создать динамическое меню, поэтому, когда пользователь выбирает страну, меню состояния обновляется.Если вы знаете, как заставить JSON работать с Rails 3.2, вы можете понять это?

Я смотрю мои журналы журналов dev и вижу, что действие запускает запрос db, а затем отображает файл json.erb, но я не могу получить ответ от браузера.

Вот что у меня есть:

Контроллеры/settings_controller.rb

respond_to :html, :json 

    def getstates 
    @states = Country.find_by_iso(params[:account][:addresses_attributes]["0"][:country]).states 
    respond_with(@states) 
    end 

(Примечание: Форма вложенная форма, именно поэтому PARAMS хэш так долго.)


Настройки/edit.html.erb

<%= address.collection_select :country, Country.order(:name), :iso, :name, {:include_blank => true}, "data-remote" => true, "data-url" => "/settings/getstates", "data-type" => :json %> 

<%= address.select :state, [], {:include_blank => true}, :disable => true %> 

настройки/getstates.json.erb

$(document).ready(function() { 

    $("#account_addresses_attributes_0_country").bind('ajax:success', function(evt, data, status, xhr){ 
     var select = $('#account_addresses_attributes_0_state'); 

     if (data !== null) { 
     select.removeAttr('disabled'); 
     $.each(data, function(key, value) { 
      $("<option/>").val(value[1]).text(value[0]).appendTo(select); 
     }); 
     } else { 
     select.empty(); 
     select.attr('disabled', 'disabled'); 
     } 
    }); 
}); 

(Примечание: Я получил этот код из http://blog.madebydna.com/all/code/2011/12/05/ajax-in-rails-3.html)


Dev регистрирует

Processing by SettingsController#getstates as JSON 
    Parameters: {"account"=>{"addresses_attributes"=>{"0"=>{"country"=>"UY"}}}} 
    User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", "1"]] 
    Country Load (0.2ms) SELECT "countries".* FROM "countries" WHERE "countries"."iso" = 'UY' LIMIT 1 
    Rendered settings/getstates.json.erb (0.3ms) 
Completed 200 OK in 3ms (Views: 1.5ms | ActiveRecord: 0.3ms) 

Это результат, который я вижу в своих журналах dev. Но ничего в браузере. Я попытался добавить предупреждения и методы консольного журнала, но ничего.

Я был бы очень признателен, если бы кто-нибудь мог помочь мне понять, что я делаю неправильно.

ответ

1

Если вы используете вкладку консоли Firebug, вы увидите запрос ajax. Затем вы можете открыть его и увидеть тело ответа. Как Райан предположил, что вы запрашиваете JSON, но возвращаете полный javascript. Поэтому, если вы должны сохранить его таким образом, вам придется анализировать ответ в вашей функции обратного вызова, то есть eval (data), или jQuery также имеет ярлык, где вы можете запросить тип «script»; Но на этот раз он немного нахмурился, что RJS был удален из Rails. Вместо этого, как предложил Дэн, переместите содержимое настроек/getstates.json.erb в ваше редактируемое представление и удалите файл getstates.json.erb. Чтобы помочь вам в создании этой работы, упростите запрос/ответ.Просто сделайте это и осмотрите его в Firebug, чтобы узнать, что происходит. После этого подключите его, чтобы включить содержимое ответа в теги параметров, которые вы хотите.

$.get("/settings/getstates", function(data){ 
    console.log(data); 
}, 'json') 
+0

Сладкий, это сработало! Мне пришлось изменить URL-адрес, чтобы включить параметры, необходимые для действия контроллера, чтобы найти состояния, но он вернул набор объектов JSON на консоль! Следующий вопрос ... как мне получить к ним доступ сейчас? По крайней мере, я хотел бы видеть их в представлении точно как проверка, но в идеале я хочу вставить их в селектор состояний в моем поле адреса. – Nathan

+0

FYI, после некоторого возиться, я понял, как захватить json и заставить JS делать то, что мне нужно. В очередной раз благодарим за помощь! – Nathan

1

Во-первых, я немного запутался в вашем представлении .json.erb. Похоже, вы возвращаете Javascript (для выполнения в браузере), когда запрос REST запрашивает JSON.

Во-вторых, я бы посмотрел на ваш любимый инструмент Firebug (будь то инструменты разработчика Chrome или Safari ... что угодно. Посмотрите, что возвращается с запроса AJAX, который вы делаете на сервер. (Возможно, это не то, что вы ожидаете - либо код ошибки, либо вы получаете что-то отличное от того, что вы, либо ожидаете collection_select).

Я предполагаю, что-то) пытается разобрать как JSON, не удается и дает сообщение об ошибке Javascript где-то (прерывание Javascript). Опять же, самый простой способ отслеживать один из них - с Firebug-подобным.

+0

В этом проблема, я ничего не вижу в консоли браузера. Если я выполняю стандартный запрос js, я могу видеть, как браузер отвечает, но нет обратной связи, ошибок, журналов. Кроме того, простите меня, но что вы имели в виду: 'irst, я немного запутался в вашем представлении .json.erb. Похоже, вы возвращаете Javascript (для выполнения в браузере), когда запрос REST запрашивает JSON. « – Nathan

+0

Nathan, JSON не является Javascript. Поместите содержимое getstates.json.erb в файл javascript, затем удалите его. response_with (@states) отобразит массив @states как JSON. –

+0

Другими словами, переименуйте getstates.json.erb в getstate.js.erb? Я пробовал это, но потом я не вижу серверные журналы, отображающие файл. – Nathan

Смежные вопросы