2010-11-09 6 views
1

Je suis en train de mettre à jour la valeur d'un attribut virtuel mais cela n'est pas reflété dans l'instance du modèle.La valeur de mise à jour de l'attribut virtuel dans la vue ne met pas à jour le modèle

Par exemple:

MyModel.erb

attr_accessor_with_default :hello_world, false 

View.html.erb

<%= @mymodel.hello_world %><br/> 
<% 
    if (@mymodel.hello_world == false) 
     @mymodel.hello_world = true 
    end 
%> 
<%= @mymodel.hello_world %> 

La vue des sorties:

false 
true 

Cependant, quand je la recharge page le même ou tput est montré, quand il devrait être:

true 
true 

Je vois le comportement ci-dessus dans un formulaire d'édition. Lorsque je soumets le formulaire (avec des erreurs de validation), il se recharge (affichant des erreurs) mais la valeur de hello_world n'est pas mise à jour.

Avez-vous des suggestions? Que dois-je faire pour obtenir le comportement souhaité?

+2

Cela me semble correct. Pourquoi vous attendez-vous à ce que la page rechargée affiche true, true. Le rechargement est une requête complètement nouvelle avec une toute nouvelle instance de @mymodel –

+0

Salut Steve, merci pour votre commentaire. Comment suggéreriez-vous que j'obtienne le comportement dont j'ai besoin? Utilisez la session? – amaseuk

+1

Si vous souhaitez conserver l'état entre les demandes et que vous ne souhaitez pas conserver les données sous une forme de stockage permanent, la session est la solution. –

Répondre

1

Votre page fonctionne comme prévu. L'attribut virtuel hello_world est initialisé en tant que false, puis défini sur true. Le problème est votre attente de ce qui se passera lorsque vous actualiserez la page.

La page rafraîchie est considérée comme une toute nouvelle requête sur rails avec sa propre (nouvelle) copie de @mymodel. C'est pourquoi vos résultats sont les mêmes lorsque l'actualisation est effectuée car l'ancienne valeur de @ mymodel.hello_world est perdue lors de la création de la nouvelle instance.

Si vous souhaitez éviter cela, vous aurez besoin d'un mécanisme pour maintenir la valeur entre les demandes. Cela peut être soit une forme de stockage persistant, telle qu'une base de données, soit vous pouvez utiliser le mécanisme standard pour conserver les valeurs temporaires entre les requêtes, à savoir la session.

0

Les attributs virtuels ne sont pas persistants entre les requêtes car ils sont simplement stockés dans l'instance @mymodel et non dans une session ou une base de données. Chaque fois que vous actualisez la page, une nouvelle instance de @mymodel est créée et ne sait rien des attributs virtuels qui lui ont été précédemment assignés.

S'il s'agit d'un attribut que vous souhaitez enregistrer, vous devez le stocker dans la base de données comme un attribut de modèle standard.

Questions connexes