Pregunta

Tengo un Crear acción para una forma que potencialmente genera errores (es decir, primero Falta el nombre) y luego vuelve a dirigir.

El problema es que cuando la redirección pasa los errores de forma perderse. ¿Cómo podría pasar esos errores de forma en una sesión que se mostrará de nuevo en la forma original (que todavía debe ser llenada con los datos anteriores, como en el comportamiento error_messages originales)?

Gracias!


El código:

def create
  @contact = Contact.new(params[:contact])
  if @contact.save
    flash[:notice] = "Sent."
  else
    flash[:notice] = "Error."
  end
end
¿Fue útil?

Solución

Este es un problema difícil que he tenido problemas con mi mismo. La primera pregunta que haría es ¿por qué necesita para redirigir cuando se encuentran errores? lo que obligó a hacer que la acción cuando hay errores fue una decisión consciente de los diseñadores del marco rieles debido a la complejidad y usabilidad preocupaciones.

Este es el gran problema, por lo que en su acción, se crea una instancia de un modelo usando params, la validación objeto falla y se decide para redirigir a otra acción. Antes de volver a dirigir a otra acción que tendría que guardar el estado actual de la instancia de modelo para la sesión y luego redirigir a la acción: foo. En la acción: foo que tendría que volver a intentar actualizar los atributos y pasar los errores a la vista a través de una variable de instancia. El problema aquí es que usted está acoplando acciones en el controlador que es una mala cosa (una acción depende de la otra). Hay una serie de otros problemas que podría tipo Sobre para siempre, pero si sólo se tiene que hacer esto para un recurso, así es como yo lo haría:

config / routes.rb

map.resources :things, :member => { :create_with_errors => :get }

things_controller.rb

def new
  @thing = Thing.new
end

def create
  @thing = Thing.create(params[:thing])
  if @thing.save
    redirect_to things_path
  else
    session[:thing] = @thing
    redirect_to create_errors_thing_path(@thing)
  end
end

def create_with_errors
  @thing = session[:thing]
  @errors = @thing.errors
  render :action => :new
end

app / views / cosas / new.html.erb

<% if defined?(@errors) %>
<% #do something with @errors to display the errors %>
<% end %>

<!-- render the form stuff -->

Yo sé lo que estás pensando ... esto es horrible. Confía en mí, he hecho un montón de intentos de abordar este problema y me he dado cuenta, el mecanismo de los desarrolladores carriles han elegido es el mejor y más fácil manera de hacer frente a los errores.

Otros consejos

La convención en Rails es hacer que la visión de la acción original en lugar de hacer una redirección. Así que el código se vería así:

def create
  @contact = Contact.new(params[:contact])
  if @contact.save
    flash[:notice] = 'Sent.'
    redirect_to @contact
  else
    flash.now[:notice] = 'Error.'
    render :new
  end
end

Si no hay ningún tipo de configuración adicional necesaria para hacer por la acción new, extraer el código común en un método privado y lo llaman en un before_filter tanto para new y create.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top