视图中虚拟属性的更新值不是更新模型

时间:2010-11-09 10:24:25

标签: ruby-on-rails virtual-attribute

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

例如:

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的值没有更新。

你有什么建议吗? 我应该怎样做才能获得理想的行为?

2 个答案:

答案 0 :(得分:1)

您的网页正常运作。 hello_world虚拟属性初始化为false,然后设置为true。问题是您对刷新页面时会发生什么的期望。

刷新的页面被视为一个全新的rails请求,带有它自己的(新)@mymodel副本。这就是为什么在刷新完成时你的结果是相同的,因为在创建新实例时,@ mymodel.hello_world的旧值会丢失。

如果您希望避免这种情况,则需要一些机制来保持请求之间的值。这可以是某种形式的持久存储,例如数据库,也可以使用标准机制在请求之间保持临时值,即会话。

答案 1 :(得分:0)

虚拟属性在请求之间不是持久的,因为它们只存储在@mymodel实例中而不存储在会话或数据库中。每次刷新页面时,都会创建一个新的@mymodel实例,并且不知道之前分配给它的虚拟属性。

如果它是您要保存的属性,则应将其存储在数据库中,如常规模型属性。