我应该如何处理我的控制器和视图所依赖的Rails模型记录?

时间:2014-08-24 15:04:38

标签: ruby-on-rails ruby ruby-on-rails-4 rspec database-cleaner

我有一个与运动队打交道的Rails应用程序。有一个模型,Club,包含所有团队,它们与Match等相关。应用程序以这些俱乐部中的一个为中心,并依赖于该记录的存在。我有一个定义主俱乐部的应用程序助手方法,基本上是:

def main_club
  @main_club ||= Club.find_by(abbrv: 'CLB')
end

然后在控制器逻辑中引用(可以为main_club执行某些您不能为其他人执行的操作)和视图(显示有关即将进行的匹配的某些关键信息等)。

这对我来说很麻烦。硬代码依赖“软”数据库记录?但我确实需要俱乐部成为一个记录,以允许其所有的关系。

我只是原样离开了它,但它搞砸了RSpec。即使在Rails.application.load_seed中运行config.before(:suite),我也会不断调整规格,因为它无法调用.matches,例如nil

这种事情是否有既定的做法?我应该怎么做呢?

编辑:种子文件包含所有当前俱乐部(包括主要俱乐部),可能会在管理界面/控制器中添加更多内容。 RSpec问题可能来自DatabaseCleaner做错了,但是a)我不确定那会是什么,以及b)无论RSpec如何,我对依赖“软”数据库记录的硬代码的担忧仍然存在。

1 个答案:

答案 0 :(得分:1)

应用程序要求数据库中的行存在才能正常运行,例如表示权限和角色的行,国家/地区代码等,这是完全正常的。

如果您考虑ActiveRecord如何依赖于架构,这可能会让您感觉更好。 Rails应用程序取决于数据库,而不是相反。根据数据库中的行不是一个很大的飞跃。

如此全速前进。你只需要了解一些细节。

可能存在问题的一个细节是,如果您将DatabaseCleaner与策略:truncation一起使用,则需要告知DatabaseCleaner不要截断您的种子。在您的spec_helper.rb(RSpec 2)或rails_helper.rb(RSpec 3)中:

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with :truncation, except: ['clubs']
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning { example.run }
  end

end

如果您想删除在测试期间创建的其他球杆,则必须手动执行:

RSpec.configure do |config|
  config.after(:each) do
    Club.where("abbrv not in(?)", %w(CLBS N YR SDS))
  end
end

如果您没有使用策略:truncation,请保持简单并且不要使用DatabaseCleaner,只需在spec_helper.rb / rails_helper.rb中使用config.use_transactional_fixtures = true