Frage

Ich habe eine Aktion für ein Formular erstellen, die möglicherweise Fehler erzeugt (das heißt Vorname fehlt) und dann Umleitungen.

Das Problem ist, dass, wenn die Umleitung jener Formfehler passiert, verloren gehen. Wie könnte ich diese Formfehler in einer Sitzung angezeigt werden wieder in der ursprünglichen Form übergeben (die noch mit den bisherigen Angaben werden sollte ausgefüllt, wie in der ursprünglichen Error_messages Verhalten)?

Danke!


Der Code:

def create
  @contact = Contact.new(params[:contact])
  if @contact.save
    flash[:notice] = "Sent."
  else
    flash[:notice] = "Error."
  end
end
War es hilfreich?

Lösung

Dies ist eine schwierige Problem, dass ich Probleme mit mir hatte. Die erste Frage, die ich fragen würde, warum Sie umleiten müssen Sie, wenn Fehler gefunden werden? Erzwingen Sie die Aktion zu machen, wenn es wurde Fehler eine bewusste Entscheidung der Designer des Rails-Framework aufgrund der Komplexität und Benutzerfreundlichkeit betrifft.

Hier ist das große Thema, so in Ihrer Aktion, erstellen Sie eine Instanz eines Modells params verwendet wird, das Objekt der Validierung fehlschlägt und Sie entscheiden, zu einer anderen Aktion zu umleiten. Bevor zu einer anderen Aktion umleiten würden Sie den aktuellen Status Ihrer Modellinstanz, um die Sitzung und dann umleiten zu Aktion speichern müssen: foo. In Aktion: foo würden Sie die Attribute erneut zu versuchen müssen zu aktualisieren und die Fehler in die Ansicht über eine Instanz-Variable übergeben. Das Problem hierbei ist, dass Sie Aktionen in Ihrem Controller sind Kopplung, die eine schlechte Sache (eine Aktion hängt von der anderen Seite). Es gibt eine Reihe anderer Probleme, die ich für immer geben konnte, aber wenn Sie dies für eine Ressource tun müssen, ist hier, wie ich es tun würde:

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 / Dinge / new.html.erb

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

<!-- render the form stuff -->

Ich weiß, was du denkst ... diese abscheulichen ist. Vertrauen Sie mir, ich habe viele Versuche unternommen, dieses Problem zu lösen, und ich bin gekommen, zu erkennen, wobei der Mechanismus die Schienen Entwickler gewählt haben, ist die beste und einfachste Weg, mit Fehlern umzugehen.

Andere Tipps

Die Konvention in Rails ist die ursprüngliche Aktion Ansicht zu machen, anstatt eine Umleitung zu tun. So Ihr Code würde wie folgt aussehen:

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

Wenn es eine zusätzliche Einrichtung ist erforderlich für die new Aktion getan werden, den gemeinsamen Code in eine private Methode extrahiert und nennt es in einem before_filter sowohl für new und create.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top