Я использую Rails 5.2.3 и пытаюсь отправить AJAX-запрос, который включает в себя JSON-представление объекта потока вызовов (не беспокойтесь о том, что это). Это представление JSON находится в текстовой области с идентификатором «newCallflowJsonDisplay». В качестве примера:

{ "callflow": [ { "action": "dial", "options": { "destination": 12121218 }, "label": "-" } ] } 

Я использую код JavaScript:

 return new Promise(function(resolve, reject){ Rails.ajax({ url: `some url`, data: `callflow_json=${document.getElementById('newCallflowJsonDisplay').value}`, type: "POST", success: function(response){resolve(response)}, error: function(response){reject(response)} }); }).then(function(res){ console.log(res); }).catch(function(error){ logError(error); }) 

С представлением JSON и кодом выше все работало так, как я ожидал. Обратите внимание, что значение для ключа «label» равно «-». В моем журнале я вижу

 {amp}lt;ActionController::Parameters {"callflow_json"={amp}gt;"{n "callflow": [n {n "action": "dial",n "options": {n "destination": 12121218n },n "label": "-"n }n ]n}", "controller"={amp}gt;"callflows", "action"={amp}gt;"manipulate", "callflow_id"={amp}gt;"61"} permitted: false{amp}gt; 

Однако, если я использую следующий JSON, где значение для ключа «label» равно » «:

 { "callflow": [ { "action": "dial", "options": { "destination": 12121218 }, "label": " " } ] } 

Я вижу в журнале:

 {amp}lt;ActionController::Parameters {"callflow_json"={amp}gt;"{n "callflow": [n {n "action": "dial",n "options": {n "destination": 12121218n },n "label": " "n }n ]n}", "controller"={amp}gt;"callflows", "action"={amp}gt;"manipulate", "callflow_id"={amp}gt;"63"} permitted: false{amp}gt; 

Как вы можете видеть, несмотря на то, что я убедился, что текстовое поле имеет правильный JSON и присутствует знак « », когда он достигает сервера, знак « » отсутствует и мой журнал не показывает его вообще ,

Я пробовал использовать буквы «*» и «/». Все они работают, кроме « ».

Что не так с моим кодом?

Заранее спасибо!

« » Не представляет {amp}lt;пробел{amp}gt; в строках запроса? Может быть, вам нужно urlencode перед отправкой …

Поэтому я считаю, что когда ajax автоматически анализирует / структурирует ваши данные, он теряет знак плюс. Один из способов обойти это состоит в том, чтобы проанализировать его самостоятельно, выполнив что-то вроде этого: var json = '{ "callflow_json": { "callflow": [{ "action": "dial", "options": { "destination": 12121218 }, "label": " " }] }}'; И тогда в вашем ajax-запросе просто укажите в качестве данных json. Таким образом, запрос AJAX правильно проанализирует его для вас.

Кроме того, я замечаю, что в ваших параметрах написано, что это запрещено, я думаю, что это создаст вам некоторые проблемы позже.

Я полагаю, что решение этой предполагаемой проблемы могло бы быть что-то вроде params.require(:your_model).permit(:callflow_json)

Я надеюсь, что это помогло и ответило на ваш вопрос!