Форма не передает данные в мою модель.Как создать данные для отправки? - PullRequest
0 голосов
/ 28 октября 2018

Проблема: форма не передает данные в таблицу заказов

У меня есть form_for, который подключен к 2 контроллерам для соединения данных после отправки. Я недавно подключил Stripe Elements, который имеет свой собственный контроллер. У меня была фиктивная форма на месте, когда я отправлял информацию, данные проходили и сохранялись в таблице заказов. Я удалил форму и поместил форму элементов на место, но способ ее настройки не передается в таблицу.

Вот форма:

  <form id="form-element" action="/charges" method="post" id="payment_form">


<%= form_for([@listing, @order]) do |form| %>


  <% if @order.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@order.errors.count, "error") %> prohibited this order from being saved:</h2>

      <ul>
      <% order.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <script

    src="https://js.stripe.com/v3/">
    // data-key="pk_test_3vX123456789YKE1f0B8"
    // data-amount = {@listing.price}
    // data-locale="auto">

  </script>

    <div class="form-row">
      <label for="card-element">
        Credit or debit card
      </label>
      <div id="card-element" class="form-control">
        <!-- a Stripe Element will be inserted here. -->
      </div>

      <!-- Used to display form errors -->
      <div id="card-errors" role="alert"></div>
    </div>
      <br>
      <div class="form-group">

    <%= form.submit "asdf", class:"ripple-effect", id:"button-element" %>
  </div>

  <span class="token"></span>
  </form>
  <% end %>
  </div>
  <script>

   ....
</script>

В моем OrdersController, вот мой метод создания:

def create
    @order = Order.new(order_params)
    @listing = Listing.find(params[:listing_id])
    @seller = @listing.user

    @order.listing_id = @listing.id
    @order.buyer_id = current_user.id
    @order.seller_id = @seller.id
    ....

Вот мой ChargesController:

def create

    @amount = 500
    token = params[:stripeToken]
    payment_form = params[:payment_form]


    charge = Stripe::Charge.create({

      :source  => 'tok_visa',


      :amount      => @amount,
      :description => 'Rails Stripe customer',
      :currency    => 'usd'
    })

  rescue Stripe::CardError => e
    flash[:error] = e.message
    redirect_to new_charge_path
  end

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

Эта информация может помочь, так что ... вот фиктивная форма, которая успешно отправит информацию в таблицу заказов: https://pastebin.com/th2WC8Lj

Я добавил form.submit к форме полосы, но этого не произошло. Я полагал, что это, по крайней мере, создаст пустой заказ.

попытка использования ajax для асинхронной отправки форм .. не работает.

<script>
...
  $('#Orders').on('submit', function(event) {
      event.preventDefault();
      $.ajax({
          type: "POST",
          url: "/charges",
          data: $('#payment_form').serialize()
      }).then(this.submit.bind(this));
    });

</script>

1 Ответ

0 голосов
/ 28 октября 2018

В настоящее время форма отправляется на конечную точку charges, что означает, что вызывается только код ChargesController#create.Вам нужно сделать следующее:

  • Дублировать код создания заряда в метод OrdersController#create и удалить тег <form id="form-element" action="/charges" method="post" id="payment_form"> в верхней части блока кода.Затем он отправит форму в метод OrdersController#create.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...