我的模型中有以下内容:
before_validation :update_temp
attr_accessor :temp_int, :temp_dec
def update_temp
self.temp = temp_int.to_f + (temp_dec.to_f / 10)
end
我认为我有以下内容:
<%= f.select(:temp_int, ["97", "98"], { :include_blank => true })%> .
<%= f.select(:temp_dec, ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"], { :include_blank => true })%>
这对于保存温度值非常有用。但是,有一个问题。通常在编辑屏幕上,选择助手将预先选择现有值。但是使用虚拟属性并没有发生这种情况。
如何确保将temp_int和temp_dec值传递给视图?
答案 0 :(得分:1)
视图访问属性应该没有问题,但是在视图的操作中是否初始化了属性?看起来,如果你刚刚加载了模型的一个实例,那么这些属性仍然是零,无论#temp
的值是多少。
请注意,如果您的操作重定向,浏览器将建立新连接以访问后续操作,并且无法访问原始操作中使用的模型实例。
也许,您需要添加如下内容:
after_initialize :init_temp_parts
def init_temp_parts
return if temp.blank?
@temp_int = temp.to_i
@temp_dec = temp - @temp_int
end
答案 1 :(得分:1)
我相信你必须在这里省略它,但是你的模型中没有attr_accessible声明吗?
通过不批量分配虚拟属性,它们的实例变量保持不变。至少,这是我的问题。
答案 2 :(得分:0)
只要您能够将当前选定的值传递给视图,就像这样:
<%= f.select(:temp_int, ["97", "98"], { :include_blank => true, :selected => @your_object.your_temp_int_value } )%>
您可能需要制作其他计算方法。