Как сопоставить значение, отправленное вызовом ajax в контроллере Rails, и отобразить сообщение об ошибке? - PullRequest
3 голосов
/ 11 февраля 2020
<%= form_for(@mymodel, remote: true, html: { id: 'match_form' }) do |f| %>
        <!-- I need to check if @mymodel.match_id matches the value generated by a controller function -->
   <%= f.submit 'Save', class: 'btn btn-primary', id: 'match_submit', style: "width:38px;padding:0px" %> 
   <%= button_tag 'Cancel', class: 'btn btn-secondary', id: 'match_cancel', style: "width:52px;padding:0px" %>
<% end%>
<script type='text/javascript'>
    $(function() {
      $(document).on("click", "#match_submit", function(event){
        $.ajax('my_controller_method', {
          type: 'GET',
          dataType: 'script',
          data: {
            mid: $("#").val(),  // how do I pass @mymodel.match_id here?
          },
          error: function(jqXHR, textStatus, errorThrown) {
          return console.log("AJAX Error: " + textStatus);
        }
      });      
    });
  </script>

У меня есть форма, как показано выше.

  1. Как передать @ mymodel.match_id в вызове ajax выше?
  2. В моей функции контроллера, Я хотел бы проверить, является ли переданный match_id определенным значением; если нет, я бы хотел отобразить модальное сообщение с сообщением об ошибке и просто кнопку Ok. Как мне этого добиться? <> a) Должен ли я вернуть правильное значение из функции контроллера и проверить то же самое в моем javascript коде выше и показать предупреждение javascript? <> <> i) Если да, то как я могу вернуть число из функции контроллера в мою вызывающую функцию JavaScript? или <> б) смогу ли я отрендерить bootstrap модал с помощью кнопки Ok в самом контроллере?

ОБНОВЛЕНИЕ 1:

Я пытался это передать match_id и id от mymodel до ajax вызова, но это не сработало:

$(document).on("click", "#match_submit", function(event){
      alert ("match id changed!");
      alert($("#match_form").data('id'));
      alert($("#match_form").data('match_id'));

      $.ajax('cpl_evaluate_match_id', {
        type: 'GET',
        dataType: 'script',
        data: {
          debit_id: $("#match_form").data('id'),
          match_id: $("#match_form").data('match_id')
        },
        error: function(jqXHR, textStatus, errorThrown) {
        return console.log("AJAX Error: " + textStatus);
      }
      });      
    });

Предупреждения для печати id и match_id печати undefined в сообщениях предупреждения .

ОБНОВЛЕНИЕ 2:

Я пытался вернуть число из функции моего контроллера, но, похоже, это тоже не сработало:

  def evaluate_match_id
    puts params[:debit_id]
    puts params[:match_id]

    return 1
  end

ход ставок выше вверх пусто

    $(document).on("click", "#match_submit", function(event){
      alert ("match id changed!");
      alert($("#match_form").data('id'));
      alert($("#match_form").data('match_id'));

      $.ajax('cpl_evaluate_match_id', {
        type: 'GET',
        dataType: 'script',
        data: {
          debit_id: $("#match_form").data('id'),
          match_id: $("#match_form").data('match_id')
        },
        success: function(result){
                    if(result){ // yes or no? 1 or 0, it's the return coming from your controller
            alert('true');
            alert(result);
          }
          else{
            alert('error');
            alert(result);
          }
        },
        error: function(jqXHR, textStatus, errorThrown) {
        return console.log("AJAX Error: " + textStatus);
      }
      });      
    });

Значение result в блоке success: в приведенном выше коде JavaScript выглядит как undefined (моя функция контроллера вслепую возвращает число 1, которым я был ожидая здесь значение result). Таким образом, условие if(result) не выполняется и вместо него вызывается блок else.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

некоторые идеи, пришедшие из PHP, без опыта из ruby -on-rails.

Вы можете передать @ mymodel.match_id в «атрибут» вашего html?

<form data-match_id='@mymodel.match_id'...
or
<form custom_name='@mymodel.match_id' ...

или аналогичный. затем вы можете использовать это на ajax для вызова данных формы через Jquery:

$("#match_form").data('match_id')
or
$("#match_form").attr('custom_name')

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

$.ajax({url: "my_controller_method", 
data: {
    mid: $("#match_form").data('match_id'),
}
success: function(result){
if(result) // yes or no? 1 or 0, it's the return coming from your controller
    alert('true');
else
    alert('error');
}});

от вашего контроллера, вы должны отобразить возвращаемое значение вместо простого возврата. (например, когда вы обращаетесь к своему контроллеру, это будет белый экран с только возвращаемым значением, таким как 1 или 0)

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

ОБНОВЛЕНИЕ 1: чтобы правильно получить требуемый атрибут в форме, сначала необходимо правильно получить элемент формы при добавлении идентификатора или любого другого метода.

<form id="match_form" data-match_id="your_value_here">

отсюда вы можете получить атрибут данных 'match_id', используя этот jquery синтаксис

var match_id = $("#match_form").data('match_id');
console.log(match_id);

, вы можете попробовать этот код на консоли вашего браузера (F12 в современных браузерах Chrome / Firefox), и он должен вывести your_value_here

в обновлении 2, вам может потребоваться вывести его, попробуйте отобразить число '1' на вашем контроллере, затем попробуйте ajax, результат будет быть числом «1».

надеюсь, что это ответ на ваш вопрос.

1 голос
/ 11 февраля 2020

Вы можете использовать attr для получения элемента значения в jquery. как то так

$('#match_form').attr('id')
...