Ruby on Rails覆盖默认访问器

时间:2010-12-09 12:56:51

标签: ruby-on-rails ruby model

在我的模特中我说:

def dag
  'test'
end

但是当我循环所有记录并使用

f.text_field :dag

我仍然没有得到"test"的值...我从数据库中获取了值。如何覆盖表单的默认getter?我说的时候我会工作

Model.dag # returns 'test'

4 个答案:

答案 0 :(得分:1)

虽然您的示例没有指出这一点,您是否将dag定义为类方法而不是实例方法? Model.dag意味着它是一个不是你想要的类方法。

答案 1 :(得分:0)

如果您可以再给我们一些代码,那么为您找到正确答案会更有用。

这样说,我怀疑你已经将dag方法声明为受保护或私有方法。 看看模型代码上的private方法声明之上是否有protected(或dag)关键字:如果是,则该方法是私有的(或受保护的),因此它不能是通过您的模板访问...

答案 2 :(得分:0)

班级:

class DenLangeKamp < ActiveRecord::Base
  belongs_to :liga, :class_name => "DenLangeLiga"

  DAYS = { "Man" => 1, "Tir" => 2, "Ons" => 3, "Tor" => 4, "Fre" => 5, "Lør" => 6, "Søn" => 7 }

  def dag
    DAYS.invert[reader_attribute(:dag)]
  end

  def dag=(dag)
    write_attribute(:dag, DAYS[dag])
  end
end

然后表单看起来像这样:

.........
<% liga_form.fields_for :kampe do |kamp_form| %>
  <tr>
    <td><%= kamp_form.text_field :dag %></td>
.........

我将这一天保存为数据库中的数字,所以我可以按日排序。 “dag”是英文的“day”。

当我说“DenLangeKamp.first.dag”时,我得到了正确的回报(比如“Man”,“Tir”等)但是在形式上,我得到了数字!所以看起来它实际上并没有正确地“覆盖”getter方法。

答案 3 :(得分:0)

我有同样的问题。重写的函数似乎适用于索引和显示,但在编辑中,表单不使用重写的函数。似乎绕过被覆盖的函数有不同的方式。