1

ビューの仮想属性の値を更新していますが、これはモデルインスタンスに反映されていません。

例えば:

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 %>

ビューの出力:

false
true

ただし、ページをリロードすると、同じ出力が表示されます。

true
true

上記の動作が編集フォームに表示されています。フォームを(検証エラー付きで)送信すると、リロード(エラーの表示)されますが、hello_worldの値が更新されません。

何か提案はありますか? 目的の動作を実現するにはどうすればよいですか?

4

2 に答える 2

1

ページは期待どおりに機能しています。hello_world仮想属性はfalseとして初期化されてから、trueに設定されています。問題は、ページを更新したときに何が起こるかを予想することです。

更新されたページは、@ mymodelの独自の(新しい)コピーを使用したRailsへのまったく新しいリクエストと見なされます。これが、新しいインスタンスが作成されるときに@ mymodel.hello_worldの古い値が失われるため、更新が実行されたときに結果が同じになる理由です。

これを回避したい場合は、リクエスト間で値を永続化するためのメカニズムが必要になります。これは、データベースなどの何らかの形式の永続ストレージにすることも、要求間、つまりセッション間で一時的な値を永続化するための標準メカニズムを使用することもできます。

于 2010-11-09T17:01:59.010 に答える
0

仮想属性は、セッションやデータベースではなく@mymodelインスタンスに格納されるだけなので、リクエスト間で永続的ではありません。ページを更新するたびに、@ mymodelの新しいインスタンスが作成され、以前に割り当てられた仮想属性については何も知りません。

保存したい属性の場合は、通常のモデル属性と同様にデータベースに保存する必要があります。

于 2010-11-09T13:00:35.537 に答える