¿Cómo vinculo a un usuario a una nueva página de formulario después de enviar un formulario en Ruby on Rails?

CorePress2024-01-24  8

Estoy intentando, sin éxito, enviar a un usuario a una nueva página de formulario "Pago" después de haber completado un "Pedido" página. Básicamente, existen dos modelos de "Pago" y "Pedido", y después del primer formulario, no quiero ir a 'pedidos/3' o cualquiera que sea la acción de visualización recién creada. En lugar de eso, quiero ir a /pagos/nuevo para poder completar la información de mi tarjeta de crédito.

<%= simple_form_for(@order) do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>
  <div class="form-inputs">
    <%# <%= f.hidden_field :cart_id, value: @cart.id%> 
    <%= f.input :first_name %>
    <%= f.input :last_name %>
    <%= f.input :address %>
    <%= f.input :city %>
    <%= f.input :state %>
    <%= f.input :zip_code %>
    <%=f.input :total_cost, :as => :hidden, :input_html => { :value => params[:total_cost]}%>
    <%=f.input :cart_id, :as => :hidden, :input_html => { :value => params[:cart_id]}%>
    <%=f.input :completed, :as => :hidden, :input_html => { :value => "no"}%>
  </div>

  <%= form_tag new_payment_path, :method => :get do %>
      <button class="btn btn-success btn-lg" type="submit">Checkout » </button>
  <% end %>
  
  <%= link_to new_payment_path({total_cost: params[:total_cost]}) do %>
    <button type="submit">"hello" </button>
  <% end %>

<% end %>

Como puedes ver, tengo dos botones en la parte inferior que estoy intentando fusionar en uno, pero todas las formas posibles de hacerlo parecen causar un error. ¿Existe alguna forma específica de hacer que el tipo de botón de la función link_to se conecte con el resto del formulario?

Disculpas de antemano si esto es bastante básico. Mi comprensión de Ruby on Rails es bastante débilpero me estoy esforzando por corregir esto rápidamente y aprender todo lo que pueda.

¿Por qué no simplemente redirigir a esa página en el controlador después de crear una orden, es decir, en el método de creación de OrdersController? Simplemente envíe el formulario, si se guarda o se redirige correctamente a la nueva página de pago. Deberían ser caminos sencillos (supongo).

- Arroz Rockwell

26/03/2021 a las 19:36

Ah, eso funcionó. Supongo que asumí que redirigir al usuario es algo que la vista debería manejar, ya que ahí es donde generalmente ocurren las funciones link_to. ¡Muchas gracias!

-H. Ingram

26/03/2021 a las 20:53

Quiero decir que hay muchas maneras diferentes de hacerlo. Pero de esta manera podrías envolverlo dentro del bloque if save y solo redirigir si se guarda, o dirigirlo nuevamente a los errores; de lo contrario, tendrás que manejar todo eso con JS o algo así.

- Arroz Rockwell

26/03/2021 a las 22:35



------------------------------------

¿Por qué no crea su formulario sin un botón que conduzca a la página de pago y, en su lugar, en el método "crear" del controlador de "pedido" después de procesar el formulario, utiliza la página "redirect_to LINK_TO_PAY"? Puedes agregar algún tipo de atributos en la sesión para reconocer al usuario y asociarlo con el pago posterior.

1

Sí, eso es lo que terminé haciendo casi exactamente. ¡Muchas gracias por tu ayuda!

-H. Ingram

26/03/2021 a las 20:54



------------------------------------

Parece que la mejor manera de manejar esto es agregar la redirección al método 'crear' en el controlador de pedidos. Terminé siguiendo el camino "/pagos/nuevo" en la función redirigir_to y todo funcionó a la perfección.

    respond_to do |format|
      if @order.save
        format.html { redirect_to "/payments/new", notice: "Order was successfully created." }
        format.json { render :show, status: :created, location: @order }
        
      else
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
      
    end
Compartir mejorar esta respuestaSeguir Respondido

26 de marzo de 2021 a las 20:57

H. Ingram

H. Ingram

11

1

1 insignia de bronce

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare