Rails передает параметры через запрос ajax с использованием JSON

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

Я подумал, что лучше всего это сделать с помощью ajax для передачи выбранной страны с помощью прослушивателя событий ввода в раскрывающемся списке.

Моя проблема в том, что запрос ajax не передает переменную JSON, которую я пишу, но передает {"object Object"=>nil, "id"=>"1"}.

Вот что у меня есть на данный момент:

    <%= form_with(model: @user) do |form| %>
    <%= form.select :country, CS.countries.values.sort, { :prompt => 'Country'} %>
    <%= form.select :city, CS.states('placeholder').keys.flat_map { |state| CS.cities(state, 'placeholder') }, { :prompt => 'City'} %>
    <%= form.submit %>
<% end %>

<script>
    var countryForm = document.getElementById('user_country');
    countryForm.addEventListener('input', function (evt) {
    var country = this.value;
    Rails.ajax({
        type: "GET",
        url: '/users/' + <%= params[:id] %> + '/country',
        dataType:'json',
        data : {'country': country},
        error: function (xhr, status, error) {
            console.log('error')
            console.error('AJAX Error: ' + status + error);
        },
        success: function (response) {
        }
    });
});
</script>

Вот что я вижу в консоли после запроса:

   Started GET "/users/1/country?[object%20Object]" for 127.0.0.1 at 2018-06-13 13:19:50 +0200
Processing by UsersController#country as JSON
  Parameters: {"object Object"=>nil, "id"=>"1"}
Completed 204 No Content in 1ms (ActiveRecord: 0.0ms)

Есть идеи, что я делаю не так? Я пробовал искать везде, но я не вижу никаких руководств по использованию JSON в Ajax. Пожалуйста помоги. Спасибо


person Laurence    schedule 13.06.2018    source источник


Ответы (3)


Нашел решение по этой ссылке после поиска повсюду: https://learnetto.com/blog/how-to-make-ajax-calls-in-rails-5-1-with-or-without-jquery

Код запроса можно записать так:

Rails.ajax({
  type: "POST", 
  url: "/things",
  data: mydata,
  success: function(repsonse){...},
  error: function(repsonse){...}
})

За исключением одного! Насколько я могу судить, вы не можете просто отправить данные в формате JSON. Итак, нам нужно вручную преобразовать mydata в тип контента application / x-www-form-urlencoded следующим образом:

mydata = 'thing[field1]=value1&thing[field2]=value2'

При этом я правильно получаю параметры:

 Parameters: {"thing"=>{"field1"=>"value1", "field2"=>"value2"}, "id"=>"1"}

По-видимому, существует автоматическое преобразование объекта данных, которое произошло в дни jquery, но отсутствует в версии rails-ujs.

person Laurence    schedule 13.06.2018
comment
Хорошая находка - надеюсь, скоро это будет исправлено. - person SRack; 14.06.2018

Я столкнулся с подобной проблемой. Затем я узнал об интерфейсе URLSearchParams, который поддерживается все современные браузеры.

Rails.ajax({
  type: 'GET',
  url: '/users/' + <%= params[:id] %> + '/country',
  data: new URLSearchParams({'country': country}).toString(),
  success: function (response) {
    // ...
  }
})
person Andrew    schedule 17.07.2019

Используйте JSON.stringify() для своих данных:

data: JSON.stringify({'country': country}),

В настоящее время вы передаете объект через вызов, а не JSON, что вызывает проблему. Я почти уверен, что это все исправит.

Ваш параметр id в порядке, поскольку он передается через URL-адрес, хотя сами данные должны передаваться в виде строки JSON.

person SRack    schedule 13.06.2018
comment
Привет, спасибо за ответ. Я пробовал это сделать, но мой строковый объект выходит не так: Parameters: {"{\"country\":\"Algeria\"}"=>nil, "id"=>"1"} Есть идеи, почему это может быть? - person Laurence; 13.06.2018
comment
Ха, это действительно странно. Что является источником Rails.ajax? Он может быть встроен, и я просто не слышал о нем, хотя в противном случае может возникнуть проблема с тем, как он передает данные. - person SRack; 13.06.2018
comment
насколько я понял, Rails.ajax - это способ rails 5 для выполнения запросов ajax без jquery. где мне искать источник? - person Laurence; 13.06.2018
comment
А, наверное, ты прав. У меня новая работа, и мы - Rails 4, так что еще не сталкивались. Дам вам знать, если я что-нибудь придумаю, приветствую за разъяснения. - person SRack; 13.06.2018
comment
В любом случае спасибо, я действительно не могу понять это поведение. если найду решение, выложу здесь - person Laurence; 13.06.2018
comment
Решением этого является использование URLSearchParams, как указано в ответе @ Andrew - person charlesdeb; 13.05.2021