我正在使用一个gemhttps://github.com/dsaronin/milia.我的一个模型叫做Group:
class Group < ActiveRecord::Base
#.....
acts_as_tenant
end
但由于某些原因,我无法创建它。这是轨道控制台:
t = Tenant.create(cname: 'cname1', company: 'comp1')
=> #<Tenant id: 3, tenant_id: nil, cname: "cname1", company: "comp1", created_at: "2015-03-03 03:39:38", updated_at: "2015-03-03 03:39:38">
[33] pry(#<Cucumber::Rails::World>)> t.valid?
=> true
[34] pry(#<Cucumber::Rails::World>)> t.new_record?
=> false
[35] pry(#<Cucumber::Rails::World>)> t.errors
=> #<ActiveModel::Errors:0x00000108a5e6d8
@base=
#<Tenant id: 3, tenant_id: nil, cname: "cname1", company: "comp1", created_at: "2015-03-03 03:39:38", updated_at: "2015-03-03 03:39:38">,
@messages={}>
但当涉及到集团时,它总是无效的:
> g = Group.new(name: 'name1')
=> #<Group id: nil, name: "name1", room: nil, person_id: nil, created_at: nil, updated_at: nil, tenant_id: nil>
[37] pry(#<Cucumber::Rails::World>)> g.tenant
=> nil
[38] pry(#<Cucumber::Rails::World>)> g.tenant = t
=> #<Tenant id: 3, tenant_id: nil, cname: "cname1", company: "comp1", created_at: "2015-03-03 03:39:38", updated_at: "2015-03-03 03:39:38">
[39] pry(#<Cucumber::Rails::World>)> g.save!
ActiveRecord::RecordInvalid: Gültigkeitsprüfung ist fehlgeschlagen: Tenant muss ausgefüllt werden
from /Users/alex/.rvm/gems/ruby-2.1.2/gems/activerecord-3.2.21/lib/active_record/validations.rb:56:in `save!'
[40] pry(#<Cucumber::Rails::World>)> g.errors
=> #<ActiveModel::Errors:0x00000108888ea8
@base=
#<Group id: nil, name: "name1", room: nil, person_id: nil, created_at: nil, updated_at: nil, tenant_id: nil>,
@messages={:tenant_id=>["muss ausgefüllt werden"]}>
[41] pry(#<Cucumber::Rails::World>)> g.valid?
=> false
[42] pry(#<Cucumber::Rails::World>)> g.new_record?
=> true
怎么了?
我看到的第一件事是,您不应该尝试手动创建租户。一个新租户对应于一个新的管理员用户创建,在milia gem中有定义的代码和过程,即使在测试中也应该遵循。具体来说:租户通过联接表与特定用户(所有者或管理员)绑定。您必须使用milia方法,文档中概述了创建新租户的方法,以便正确创建所有内容,包括用户的设计要求。
其次,"Group"对于一个模型来说是一个糟糕的名称,可能与Rails关键字冲突。您应该重命名您的模型,因为这可能最终成为错误的来源。您不应该使用Rails通用的名称。更具体一些,比如模型的"MyappGroup"。
因此,如果您试图创建一个租户/组进行测试,则应该使用fixture。同样,在milia测试目录中有一些示例可以说明如何做到这一点。