ruby on rails自定义setter帮助

时间:2010-09-29 23:08:23

标签: ruby-on-rails ruby attributes setter

对不起我的英文,

我有一个名为Recipe的模型,而Recipe有一个名为duration

的属性

在我的表单中,我有2个下拉列表来获取持续时间属性

select_tag 'duration[hours]'
select_tag 'duration[minutes]'

我需要像这种格式hh:mm:ss

这样的持续时间属性的值

我试过

def duration=(d)
  self.duration = "#{d[:hours]}:#{d[:minutes]}:00"
end

但这不起作用

请帮助

建议!

4 个答案:

答案 0 :(得分:7)

使用

def duration=(d)
  self.duration = "#{d[:hours]}:#{d[:minutes]}:00"
end

在你的方法中,你称之为自己,因为它是相同的方法。您需要更改属性持续时间而不是方法

def duration=(d)
  write_attribute(:duration, "#{d[:hours]}:#{d[:minutes]}:00")
end

答案 1 :(得分:4)

以下是您正在寻找的正确语法:

在视图中(recipes / _form.html.erb ...)

select_tag 'duration[hours]'
select_tag 'duration[minutes]'

在模型中(recipe.rb ...)

def duration=(d)
  write_attribute(:duration, "#{d[:hours]}:#{d[:minutes]}:00")
end

为完整起见,要覆盖getter

def duration
  read_attribute(:duration)
end

您也可以使用:

self[:duration] = "#{d[:hours]}:#{d[:minutes]}:00"
self[:duration]

但不是:

self.duration = "#{d[:hours]}:#{d[:minutes]}:00"
self.duration

通过self.name将调用getter或setter函数(您试图覆盖它们)

答案 2 :(得分:0)

您的表单元素名为hoursminutes,但您的模型正在寻找hm个键?

这真的是你的意思吗?

答案 3 :(得分:0)

好的,我解决了它

select_tag 'custom_duration[hours]'
select_tag 'custom_duration[minutes]'

我创建了一个名称不同于属性的setter方法来设置我的属性

def custom_duration=(d)
  self.duration = "#{d[:hours]}:#{d[:minutes]}:00"
end
无论如何

问候。