2008-10-01 5 views
2

J'ai un modèle de base dans lequel j'ai spécifié certains des champs pour valider la présence de. dans la création action dans le contrôleur que je fais la norme:RoR: Création/Mise à jour: Affichage des erreurs de validation tout en préservant les valeurs précédentes

@obj = SomeObject.new(params[:some_obj]) 

if @obj.save 
    flash[:notice] = "ok" 
    redirect... 
else 
    flash[:error] = @obj.errors.full_messages.collect { |msg| msg + "<br/>" } 
    redirect to new form 
end 

mais quand je réoriente à la nouvelle forme, les erreurs montrent, mais les champs sont vides. existe-t-il un moyen de repeupler les champs avec les valeurs saisies afin que les erreurs puissent être corrigées facilement?

Répondre

5

Vous render :action => :new plutôt que de rediriger.

+0

La raison derrière cela est que vous conservez l'objet en mémoire plutôt que de créer un nouvel objet; la redirection démarre une requête entièrement nouvelle. –

+0

L'inconvénient est que le formulaire pour créer un objet SomeObject a maintenant deux URL: /some_objects/new # pour le premier formulaire /some_objects # après un échec POST Pas grand chose à faire à ce sujet, cependant. –

+0

Bons points Ian & Gauis –

1

Capturez également @obj dans le hachage flash, puis recherchez-le dans l'action new.

@obj = SomeObject.new(params[:some_obj]) 

if @obj.save 
    flash[:notice] = "ok" 
    # success 
else 
    flash[:error] = @obj.errors.full_messages.collect { |msg| msg + "<br/>" } 
    flash[:obj] = @obj 
    # redirect to new form 
end 

En new:

@obj = flash[:obj] || MyClass.new 
Questions connexes