我想在种子上使用我用于RSpec

时间:2018-03-22 14:42:52

标签: ruby-on-rails ruby-on-rails-4 sqlite rspec-rails seeding

我有这个AuthorizationHelpers,我在RSpec上使用。

module AuthorizationHelpers
  def assign_role!(user, role, post)
    Role.where(user: user, post: post).delete_all
    Role.create!(user: user, role: role, post: post)
  end
end

RSpec.configure do |c|
  c.include AuthorizationHelpers
end

现在我想在种子上使用这种方法assign_role!。 像这样:

Post.all.each do |post|
    [:manager, :editor, :viewer].each do |role|
      User.all.where(admin: false).each do |user|
          assign_role!(user, role, post)
      end
    end
  end

如果我尝试在rails控制台上使用它,我会收到错误:

NoMethodError: undefined method `assign_role!' for main:Object

有没有办法在种子上使用它?或者我需要做其他事情?

2 个答案:

答案 0 :(得分:1)

In the end, the OP abandoned use of the module and did the following in seeds.rb:

unless Post.exists?(title: title)
post = Post.create!(...)
[:manager, :editor, :viewer].each do |role|
  if user = User.find_by_email("#{role}@newscity.com")
    user.roles.create(post: post, role: role)
  end
end

Check out the chat (in the original question comments) for the whole story.

答案 1 :(得分:0)

这个答案不一定与您的问题有关,而是与您的代码的语义有关。

首先:为什么你没有将assign_role!定义为用户模型的实例方法,你可以在任何地方使用?对于那种逻辑来说似乎是一个合理的地方。

第二:种子应该是应用程序在全新安装后正常工作的最小数据。通常这是一次性命令;要在规范中创建数据,请考虑使用工厂(一个流行的库是FactoryGirl)。

您的代码调用spec文件夹中定义的内容会感觉不自然。