Ruby on rails 为什么这个ERB代码在夹具中抛出';未定义的方法';?

Ruby on rails 为什么这个ERB代码在夹具中抛出';未定义的方法';?,ruby-on-rails,ruby,testing,Ruby On Rails,Ruby,Testing,我试图使用fixture来添加更复杂的测试数据,以便使用Flex中的前端测试特定场景。我不确定这是否是使用rails的正确方式。我的rails应用程序是一款纸牌游戏,我尝试测试的“更复杂的测试数据”是各种纸牌组合 例如,我想设置一个测试游戏,其中玩家1手上有卡B和卡C,我特别在一个固定装置中将卡B和卡C添加到玩家的手上 我为玩家、游戏和用户提供了基本的设备,这些设备已经存在了一段时间,运行良好。我已尝试在games fixture中添加以下erb代码,以调用Game.start方法,并获得 No

我试图使用fixture来添加更复杂的测试数据,以便使用Flex中的前端测试特定场景。我不确定这是否是使用rails的正确方式。我的rails应用程序是一款纸牌游戏,我尝试测试的“更复杂的测试数据”是各种纸牌组合

例如,我想设置一个测试游戏,其中玩家1手上有卡B和卡C,我特别在一个固定装置中将卡B和卡C添加到玩家的手上

我为玩家、游戏和用户提供了基本的设备,这些设备已经存在了一段时间,运行良好。我已尝试在games fixture中添加以下erb代码,以调用Game.start方法,并获得

NoMethodError: undefined method `games' for main:Object
夹具代码片段为:

four:
  id: 4
  num_players: 3
  turn_num: 0
  status_id: 1

<% game_four = games(:four).find
   game_four.start
%>
4:
身份证号码:4
玩家数量:3
转动次数:0
身份证号码:1
博弈方法只存在于测试用例中,不存在于夹具中。 您应该查询数据库或使用关系。 这只是一个例子

four:
  id: 4
  num_players: 3
  turn_num: 0
  status_id: 1

<% Game.find_by_name(four).start %>
4:
身份证号码:4
玩家数量:3
转动次数:0
身份证号码:1
而且,这并不是这样的命令的正确位置。赛程不是为了“开始比赛”。 您真的应该将此命令移到其他地方,可能是在设置块内的专用测试用例中

编辑:

我在这里复制了几天前发布的关于原始答案的评论,其中包含指向新Rails数据库种子功能的链接:


这是Yehuda Katz在他的回答中解释的,也是解决这个问题的最好方法。

可能最好的解决方案(事实上,现在在edge上被认可的解决方案)是在db目录中有一个seeds.rb文件,您可以从rake任务加载该文件

下面是Rails现在在edge上所做的工作(将在Rails 3中介绍)

然后是一个新的rake任务(可以添加到Rakefile中):

如果您这样设置seeds.rb文件,您将遵循新的约定,并且在升级到Rails 3时能够删除seeds-rake任务


此外,数据迁移是而不是。据我所知,这是公认的,也是Rails核心团队的普遍观点。

如果您想使用fixtures方法(在为开发加载数据时,而不是在测试期间),您可以使用fixtures\u references插件。它的行为将是相同的。

我尝试了按名称查找,但我没有“名称”属性,因此我尝试了这样做,它说找不到ID=4find\u by\u name的游戏只是一个例子。您应该为游戏使用正确的标识符。您不能使用ID,因为它们是由Rails唯一生成的,并且不像您预期的那样反映集合中的项目编号;我想我需要一个新的问题,比如“如何使用rails在我的开发环境中设置数据,而不使用rails测试?”在我看来,您重新表述的问题最好用迁移来回答,迁移可以在表中设置默认数据。在这些情况下,为了清晰起见,建议其他人在阅读您的迁移时,显式地在设置数据时执行“start”方法的工作,而不是在ActiveRecord对象上实例化和调用它。如果您不进行测试,您就不是在用Rails的方式进行迁移。;)不过,你的答案可能在这里,谢谢你的补充意见;我已经在迁移中加载了一些引用或查找数据(这是否正确还存在争议);但在谷歌搜索了很多次(包括查找seed_-fu、Populate等)之后,我最终编写了一个rake任务来加载我想要的特定场景;我还希望能够在我的模型上使用一些方法来操纵数据,这也让我能够做到这一点,非常感谢你的帖子;我给weppos的答案是因为它回答了帖子中的具体问题;然而,您的回答对于我正在尝试做的事情以及如何在当前的Rails惯例中做到这一点非常有帮助
four:
  id: 4
  num_players: 3
  turn_num: 0
  status_id: 1

<% Game.find_by_name(four).start %>
# db/seeds.rb
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#   
#   cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
#   Major.create(:name => 'Daley', :city => cities.first)
desc 'Load the seed data from db/seeds.rb'
task :seed => :environment do
  seed_file = File.join(Rails.root, 'db', 'seeds.rb')
  load(seed_file) if File.exist?(seed_file)
end