使用函数修改活动记录模型



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

我通过"耙子测试测试/功能/song_test.rb"用耙子运行我的测试。数据是从yaml文件加载的,这似乎是正确的。但是当我调用我的"vote!"函数(见下文)来修改属性时,@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

我认为该对象有两个副本,并且对临时对象调用了 vote! 函数。但我不明白会如何或为什么会这样。

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

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

您在现有代码中执行的操作是创建一个未使用的实例变量。

请注意,按照惯例,称为 vote! 的方法将具有保存对模型所做的更改的效果。例如:

self.update_attribute(:rating, num_stars)

最新更新