¿Cómo crear tres registros usando un formulario? ¿Y cómo mostrar los errores de validación para ellos?

Básicamente, mi problema es qué hacer si tengo 3 formularios y un botón de envío.

Quiero crear un formulario que envíe un correo electrónico a cada destinatario y luego crear un nuevo registro en la tabla free_registration_coupons.

Necesito validación de correo electrónico para este formulario.

enter image description here

Modelo GratisRegistroCupón: destinatario_email, token, sender_id

Por ahora tengo esto:

class FreeRegistrationCouponsController < ApplicationController
  def send_invitations
    emails = [params[:recipient_email_1], params[:recipient_email_2], params[:recipient_email_3]]
    emails.reject!{ |e| e.eql?("") }

    if emails.present?
      emails.each do |e|
        FreeRegistrationCoupon.create(:recipient_email => e, :sender_id => current_user.id)
        #MAILER
      end
      redirect_to root_path, :notice => "You just send #{emails.size} invitations!"
    else
      redirect_to(:back)
    end
  end
end


class FreeRegistrationCoupon < ActiveRecord::Base
  before_save :generate_token

  attr_accessor :recipient_email, :sender_id
  validates :recipient_email, :presence => true, :email => true

  def generate_token
    self.token = SecureRandom.hex
  end
end

Esta es la forma que está en otro controlador CarsController#confirmar:

<%= form_tag :controller => 'free_registration_coupons', :action => "send_invitations" do %>
  <!-- errors -->
  <%= label_tag :recipient_email_1 %>
  <%= text_field_tag :recipient_email_1 %>
  <%= label_tag :recipient_email_2 %>
  <%= text_field_tag :recipient_email_2 %>
  <%= label_tag :recipient_email_3 %>
  <%= text_field_tag :recipient_email_3 %>
  <%= submit_tag %>
<% end %>

preguntado el 03 de mayo de 12 a las 18:05

Esto puede ser de ayuda: stackoverflow.com/questions/4641565/… -

1 Respuestas

Creo que deberías haber definido tu formulario usando:

<%= form_tag :controller => 'free_registration_coupons', :action => "send_invitations" do %>
  <%= @error_message %>
  <%= label_tag "recipient_email[1]" %>
  <%= text_field_tag "recipient_email[1]" %>
  <%= label_tag "recipient_email[2]" %>
  <%= text_field_tag "recipient_email[2]" %>
  <%= label_tag "recipient_email[3]" %>
  <%= text_field_tag "recipient_email[3]" %>
  <%= submit_tag %>
<% end %>

De esta manera, será más fácil tratar todas las direcciones de correo electrónico en su controlador y podrá rastrear esos errores para mostrarlos después:

class FreeRegistrationCouponsController < ApplicationController
  def send_invitations
    emails = params[:recipient_email]
    emails.reject!{ |param, value| value.eql?("") }
    errors = []
    if emails.any?
      emails.each do |param, value|
        validation_result = FreeRegistrationCoupon.save(:recipient_email => value, :sender_id => current_user.id)
        #MAILER
      end
      redirect_to root_path, :notice => "You just send #{emails.size} invitations!"
    else
      @error_message = "You have to include, at least, one e-mail address!"
      render :name_of_the_action_that_called_send_invitations      
    end
  end
end

No probé este código. ¡Espero eso ayude!

contestado el 11 de mayo de 12 a las 16:05

Pero render :name_of_the_action_that_called_send_invitations es a otro controlador con id - tomekfranek

No te entiendo muy bien, pero si estás redirigiendo al usuario a otro controlador, no relacionado con el formulario en sí, algo se siente mal... ¿No hay ninguna acción nueva dentro de FreeRegistrationCouponsController? - Rudy Seidinger

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.