2011-07-16 1 views
4

Je travaille actuellement sur plusieurs tutoriels Rails, mais tous semblent recommander qu'une soumission de formulaire échouée utilise un rendu pour générer le formulaire avec les erreurs. Par exemple, la méthode create ressemble à ceci:Conserver une URL sur une soumission de formulaire ayant échoué dans Ruby on Rails

def create 
    @user = User.new(params[:user]) 
    if @user.save 
    flash[:success] = "Welcome to the Sample App" 
    redirect_to @user 
    else 
    @title = "Sign up" 
    render 'new' 
    end 
end 

Cela a pour effet désiré, mais signifie que si j'ai un nouveau formulaire utilisateur à http://localhost:3000/users/new et une erreur se produit, je reçois la même forme avec des erreurs à http://localhost:3000/users

Y a-t-il un moyen de s'assurer que je vais à http://localhost:3000/users/new à la place?

Je pensais utiliser une redirection au lieu de rendre "nouveau", mais cela causerait des problèmes avec l'affichage des erreurs de formulaire. Quelqu'un sur le Rails IRC m'a orienté vers une manière de faire des validations client, mais cela semble être une façon d'esquiver le problème.

+1

Honnêtement, je ne vois pas pourquoi ce comportement est un problème. – Wukerplank

+0

Je suis sûr que c'est juste moi, mais ça ne me semble pas juste. Scénario improbable et hypothétique, mais que se passerait-il si quelqu'un m'envoyait un e-mail disant "j'obtiens des erreurs que je ne devrais pas sur cette page:" et ensuite copié et collé l'URL? – RobL

Répondre

2

J'ai rencontré un problème similaire avec mon formulaire d'inscription d'utilisateur. Comme je ne pas utiliser les routes RESTful là, j'ai pu résoudre avec les routes suivantes:

resources :users, :except => [:new, :create] do 
    ... 
end 
get "/signup" => "users#new" 
post "/signup" => "users#create" 

et dans la nouvelle forme:

form_for @user, :url => signup_path do ... 
+0

Merci! Je me demandais si c'était un problème de routage. J'y vais avec ça, mais on dirait que ça devrait le réparer! – RobL

1

Essayez plutôt redirect_to :action => 'new' au lieu de simplement rendre, cela conservera l'URL, mais les informations sur les erreurs seront perdues (sauf si vous le mettez dans flash).

L'autre option consiste à soumettre le formulaire à l'URL utilisée pour l'afficher. Au début de l'action, vous vérifiez s'il y a des données à traiter. Si le traitement se passe bien, vous redirect_to ailleurs, sinon vous ne faites rien - le formulaire s'affiche, avec toutes les erreurs. Ceci, je suppose, n'est pas très Railsy, ​​mais cela devrait fonctionner comme vous voulez.

+0

Merci! La deuxième option aide. Je sais que ce n'est pas nécessairement Rails-y, mais cela devrait au moins régler le problème. – RobL

1

Désolé d'être en retard (à peine 6 ans) à la fête, mais d'une manière ou d'une autre cela semble être un problème avec Turbolinks.

Voir ces questions here et here.

Questions connexes