ROR: как извлекать данные из представления в контроллер

#ruby-on-rails

#ruby-on-rails

Вопрос:

Это долгое время меня смущало. У меня есть это поле ввода в моих частичных представлениях:

 <input name="promocode" class="field" placeholder="Arlington" id="promo_code">
  

И у меня есть основная форма на моей странице макета под названием «new_user» и одна кнопка signupBtn

   $("#signupBtn").click(function (e) {
          e.preventDefault();

          var promocode = document.getElementById('promo_code').value;
          ...
  

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

Здесь, в основной форме, у меня есть скрытое поле

 <%= hidden_field_tag :promo_code, '' %>
  

Я хочу передать промо-код своему контроллеру, я пишу эту строку внутри контроллера:

 $("#promo_code").val(promocode);
  

Затем возникает проблема, когда я хочу получить данные в контроллере,

 aaa = params[:promo_code]
  

Это дает мне «», я не понимаю, так как я проверил $(«#promo_code»).val() в представлении, он показывает правильные данные, но когда я проверил контроллер, он не передается;
Я провел здесь целый день, я знаю, что я новичок в ROR, но я просто не могу найти проблему…

Комментарии:

1. Можете ли вы отредактировать вопрос, чтобы включить всю форму в том виде, в каком она существует в файле, а также добавить пример того, как параметры выглядят при передаче на контроллер?

Ответ №1:

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

Клиенты должны возвращать первый элемент в DOM в случае дублирования идентификаторов при вызове document.getElementById and document.querySelector .

Таким образом, строка $("#promo_code").val(promocode); на самом деле просто изменяет значение первого элемента на его собственное значение. Другими словами, он абсолютно ничего не делает.

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

 $(document).on('click', '#signupBtn', function(e){
  this.form["promo_code"].value = $('#promo_code').val();
  e.preventDefault(); // prevents a redirect for the purpose of demonstration.
});  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="promo_code" value="foobarbaz" type="hidden" />

<form>
  <input name="promo_code" value="" />
  <button id="signupBtn">Copy code</button>
</form>  

И, как указано @3limin4t0r, значения формы отправляются с использованием входного имени, а не идентификатора. Так что ввод будет отправлен как params[:promocode] нет params[:promo_code] .