¿Cómo crear tres registros usando un formulario? ¿Y cómo mostrar los errores de validación para ellos?
Frecuentes
Visto 348 veces
2
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.
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 %>
1 Respuestas
3
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 ruby-on-rails ruby ruby-on-rails-3 forms or haz tu propia pregunta.
Esto puede ser de ayuda: stackoverflow.com/questions/4641565/… - John