使用函数修改ActiveRecord模型

时间:2013-10-15 18:14:42

标签: ruby-on-rails ruby

我刚学习RoR而且我在单元测试中遇到了一个问题,我编写的一个简单函数不会适当地修改它的对象。我必须遗漏一些非常基本的东西,因为我在任何论坛都看过这个问题。

我通过“rake test test / functional / song_test.rb”用rake运行我的测试。数据从yaml文件加载,这似乎是正确的。但是,当我打电话给我的“投票!”函数(见下文)修改属性@rating,在测试中看不到变化,我的断言失败。

test "vote!" do
  song1 = songs(:song1)                         # 'songs' was loaded from a yaml file
  assert song1.respond_to?('vote!'), "Can't vote!()!"
  assert_equal 5, song1.rating, "Rating is wrong"  # assertion passes

  song1.vote!(1)

  assert_equal 1, song1.rating, "Rating should be 1" # assertion fails
end 

以下是失败消息:

SongTest#test_vote! = 0.00 s                         
  1) Failure:
test_vote!(SongTest) [/test/functional/song_test.rb:35]:
Rating should be 1.
<1> expected but was
<5>.

我使用puts()验证了更改确实在投票中发生了!功能。但是在函数返回后,song1.rating值没有改变。这是投票的班级!功能

class Song < ActiveRecord::Base
  validates :rating, :presence => true

  def vote!(num_stars)
    @rating = num_stars
  end
end

我认为对象有两个副本和投票!在临时对象上调用函数。但我不明白这是怎样或为什么会这样。

1 个答案:

答案 0 :(得分:1)

rating属性与@rating实例变量无关。您的vote!方法应如下所示:

def vote!(num_stars)
  self.rating = num_stars
end

您在现有代码中所做的是创建一个未使用的实例变量。

作为一个注释,按照惯例,名为vote!的方法可以保存对模型所做的更改。例如:

self.update_attribute(:rating, num_stars)