1

我正在更新视图中虚拟属性的值,但这并未反映在模型实例中。

例如:

我的模型.erb

attr_accessor_with_default :hello_world, false

查看.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 回答