我从rspec开始,所以我不知道如何进行以下操作:
我在User
和Label
之间有一个名为Assignment
的多对多表格。
例如。
制造者:
Fabricator(:label) do
name { sequence(:name) { |i| "Label #{i}" } }
end
Fabricator(:user) do
email { sequence(:email) { |i| "user#{i}@email.com" } }
password 'password'
end
型号:
class Label < ActiveRecord::Base
has_many :issues
has_many :assignments
has_many :users, :through => :assignments
class User < ActiveRecord::Base
has_many :assignments
has_many :labels, :through => :assignments
class Assignment < ActiveRecord::Base
belongs_to :user
belongs_to :label
end
class Issue < ActiveRecord::Base
belongs_to :user
belongs_to :label
after_create :print_first_user_label_email
def print_first_user_label_email
puts self.label.users.first.email
end
end
每次创建问题时,问题都必须打印为问题标签分配的用户。但它要求标签应该已经与用户(作业)有链接。
因此,一个简单的Fabricate(:issue)将触发:
let(:issue) { Fabricate(:issue) }
-- Output ---------------------------------------
Failure/Error: let(:issue) { Fabricate(:issue) }
NoMethodError:
undefined method `email' for nil:NilClass
那么,我该如何解决呢。打桩?以某种方式播种表?定义在制造商?
任何帮助都会很棒!
答案 0 :(得分:1)
表面......它不尽如人意。你怎么做issue.label?
...暂定
[issue_fabricator]
Fabricator(:issue) do
end
[规格]
let(:label){ Fabricate(:label) }
let(:issue){ Fabricate(:issue, :label=>label) }
#=> undefined method `email' for nil:NilClass
好。和print_first_user_label_email工作是...
自我#=&gt;问题
.label#=&gt;标签
.users#=&gt; [](空)
.first#=&gt;零
.email#=&gt;未定义的方法
试一试:
let(:user) { Fabricate(:user) }
let(:label){ Fabricate(:label, :users=>[user]) }
let(:issue){ Fabricate(:issue, :label=>label) }
或在{}阻止之前分配关系。