2010-11-08 57 views
5

Je progresse bien avec ma première application Rails (en utilisant Rails 3). L'interaction MVC se passe bien, mais j'ai des difficultés avec un formulaire qui ne se rapporte pas directement à un modèle. J'utilise form_tag, et dans le cas de succès, tout se comporte bien. Cependant, le traitement des erreurs est quelque peu hostile. Le message d'erreur réel est stocké dans le flash et affiché correctement par layouts/application.html, mais j'aimerais vraiment que le formulaire se souvienne du contenu que l'utilisateur vient de remplir. Mais ce n'est pas le cas: tous les champs réinitialiser à leurs valeurs par défaut. J'adore la façon dont les formes d'actions RESTful sur les objets se souviennent automatiquement de leurs valeurs soumises, et sont surlignées en rouge en cas d'erreurs. Je vais bien sans la surbrillance rouge, mais j'aimerais vraiment que les champs du formulaire conservent les valeurs soumises.Rails: Restauration du contenu d'un formulaire non-modèle qui utilise form_tag

Quelqu'un peut-il conseiller comment faire?

Extraits des dossiers pertinents:

vues/cardsets/import.html.erb:

<%= form_tag :action => :import_data, :id => @cardset do %> 
    ... 
    <%= text_field_tag "separator", "", :maxlength => 1 %> 
    ... 
    <%= text_field_tag "formatting_line" %> 
    ...etc (more fields) 

contrôleurs/cardsets_controller.rb:

# POST /cardsets/1/import_data 
def import_data 
    success, message = @cardset.import_data(params, current_user) 
    if success 
    redirect_to(@cardset, :notice => message) 
    else 
    flash.now[:error] = message 
    render :import 
    end 
end 

Répondre

9

La deuxième arg à text_field_tag ​​est- la valeur à remplir dans le champ avec. Essayez quelque chose comme ceci:

<%= text_field_tag "separator", params[:separator], :maxlength => 1 %> 
+0

A travaillé super! Merci! – AlexC

1

Si votre champ a un défaut, vous voulez le mettre à l'action « show » pour la forme:

# GET 
def show_form 
    params[:key] = 'default' 
end 

# POST 
def validate_form_and_act 
    # Don't set it here to reuse what the user passed. 
end 

ou directement sur le modèle (moins bonne car utilise un || à chaque fois et ajoute plus de données de contrôleur à afficher):

<%= text_field_tag 'name', params[:key] || 'default' %>