我正在视图中更新虚拟属性的值,但这并未反映在模型实例中。
例如:
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的值没有更新。
你有什么建议吗? 我应该怎样做才能获得理想的行为?
答案 0 :(得分:1)
您的网页正常运作。 hello_world虚拟属性初始化为false,然后设置为true。问题是您对刷新页面时会发生什么的期望。
刷新的页面被视为一个全新的rails请求,带有它自己的(新)@mymodel副本。这就是为什么在刷新完成时你的结果是相同的,因为在创建新实例时,@ mymodel.hello_world的旧值会丢失。
如果您希望避免这种情况,则需要一些机制来保持请求之间的值。这可以是某种形式的持久存储,例如数据库,也可以使用标准机制在请求之间保持临时值,即会话。
答案 1 :(得分:0)
虚拟属性在请求之间不是持久的,因为它们只存储在@mymodel实例中而不存储在会话或数据库中。每次刷新页面时,都会创建一个新的@mymodel实例,并且不知道之前分配给它的虚拟属性。
如果它是您要保存的属性,则应将其存储在数据库中,如常规模型属性。