2010-02-17 7 views
0

Dans la plupart des exemples que je vois, je remarque que dans le contrôleur, la nouvelle méthode a simplement:formes avec des variables Validating

@object = Object.new 

Dans la méthode de création, vous verrez quelque chose comme:

@object = Object.find(params[:object]) 
    if @object.save 
     flash[:success] = "This object has been added." 
     redirect_to objects_path 
    else 
     render :action => 'new' 
    end 

Cela fonctionne très bien, mais la seule chose que je tombe (assez courant), est lorsque les tests échouent en utilisant certaines méthodes intégrées d'aide:

validates_presence_of: valeur

le "render: action => 'new' sera appelé. Alors les rails contourne le contrôleur et va directement à l'action pour de nouveau, ce qui tente de rendre le formulaire.

Ce contournement du contrôleur me tue, car parfois je charge des valeurs dans le formulaire en utilisant des valeurs que j'ai définies dans mon contrôleur.

Je finirai par obtenir des erreurs à cause de valeurs nulles, car les rails ont contourné le contrôleur et les valeurs n'ont jamais été définies lors du chargement de "render: action => 'new'".

Ma question: Quelle est la meilleure façon de rediriger un formulaire (ou les meilleures pratiques en général) lors de la validation d'un formulaire auquel sont assignées des variables définies dans le contrôleur? Je veux éviter ces erreurs de valeur nulle, donc je pense que je fais juste mal pour commencer.

Répondre

1

Vous pouvez déplacer votre bit personnalisé de code qui charge vos différentes valeurs dans un before_filter, un peu comme:

before_filter :get_values, :only => [:new, :create] 

def new 
    # your code here 
end 

def create 
    @object = Object.new params[:object 
    if @object.save 
    flash[:success] = "This object has been added." 
    redirect_to objects_path 
    else 
    render :action => 'new' 
    end 
end 

private 

def get_values 
    # your code here 
end 
+0

Ah ah! La réponse me regardait droit dans les yeux. J'utilise avant tout les filtres pour construire d'autres choses, et je n'ai jamais cassé ce qui pourrait aussi être utilisé pour les formulaires. Merci! :) – Steve

0

Une façon: rendre les champs cachés pour toutes ces variables, de sorte que votre objet aura déjà les en create action. Autre façon: créez un before_filter pour ces deux actions.

Personnellement j'irais avec la deuxième option.