将虚拟属性值传递给Rails 3中的表单元素

时间:2011-04-12 01:08:52

标签: ruby-on-rails ruby-on-rails-3

我的模型中有以下内容:

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值传递给视图?

3 个答案:

答案 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_accessor,并忘记声明它也可以访问。

我相信你必须在这里省略它,但是你的模型中没有attr_accessible声明吗?

通过不批量分配虚拟属性,它们的实例变量保持不变。至少,这是我的问题。

答案 2 :(得分:0)

只要您能够将当前选定的值传递给视图,就像这样:

<%= f.select(:temp_int, ["97", "98"], { :include_blank => true, :selected => @your_object.your_temp_int_value } )%>

您可能需要制作其他计算方法。