如何在测试装置中使用acts-as-taggable-on?

Ste*_*ath 1 ruby-on-rails fixtures minitest acts-as-taggable-on

看起来acts-as-taggable-on 在它设置的数据表中使用了多态关系。我如何让它与 minitest 中的装置一起工作?

我有一个Lead实现的模型acts-as-taggable。看起来这将以下内容添加到模型中:

has_many :taggings, :as => :taggable, :dependent => :destroy, :class_name => "ActsAsTaggableOn::Tagging"
has_many :base_tags, :through => :taggings, :source => :tag, :class_name => "ActsAsTaggableOn::Tag"
Run Code Online (Sandbox Code Playgroud)

我的线索表:

  create_table "leads", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.string   "phone"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "user_id"
  end
Run Code Online (Sandbox Code Playgroud)

由acts-as-taggable-on 创建的表:

  create_table "taggings", force: true do |t|
    t.integer  "tag_id"
    t.integer  "taggable_id"
    t.string   "taggable_type"
    t.integer  "tagger_id"
    t.string   "tagger_type"
    t.string   "context",       limit: 128
    t.datetime "created_at"
  end

  add_index "taggings", ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true, using: :btree

  create_table "tags", force: true do |t|
    t.string "name"
  end

  add_index "tags", ["name"], name: "index_tags_on_name", unique: true, using: :btree
Run Code Online (Sandbox Code Playgroud)

gem 中有一个 Tagging 类,其中包括:

belongs_to :tag, :class_name => 'ActsAsTaggableOn::Tag'
belongs_to :taggable, :polymorphic => true
belongs_to :tagger,   :polymorphic => true
Run Code Online (Sandbox Code Playgroud)

以下是我的装置按照多态关系的Rails api 文档的样子:

# leads.yml
onetag1:
  name: "OneTag1 Lead"
  email: "lead@onetag1email.com"
  phone: "14120006002"
  base_tags: one
onetag2:
  name: "OneTag2 Lead"
  email: "lead@onetag2email.com"
  phone: "14120006003"

# taggings.yml
one:
  tag: one
  taggable: onetag1 (Lead)
two:
  tag: two
  taggable: onetag2 (Lead)

# tags.yml
one:
  name: "Tag one"
two:
  name: "Tag two"
Run Code Online (Sandbox Code Playgroud)

但我得到:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "tag" of relation "taggings" does not exist
LINE 1: INSERT INTO "taggings" ("tag", "taggable") VALUES ('one', 'o...
                                ^
: INSERT INTO "taggings" ("tag", "taggable") VALUES ('one', 'onetag1 (Lead)')
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

# taggings.yml
one:
  taggable: onetag1 (Lead)
two:
  taggable: onetag2 (Lead)
Run Code Online (Sandbox Code Playgroud)

没有参考tag. 但在这里我得到:

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "taggable" of relation "taggings" does not exist
LINE 1: INSERT INTO "taggings" ("taggable") VALUES ('onetag1 (Lead)'...
                                ^
: INSERT INTO "taggings" ("taggable") VALUES ('onetag1 (Lead)')
Run Code Online (Sandbox Code Playgroud)

我缺少什么?如何将标签与夹具中的引线关联起来?

Rya*_*yan 6

我知道这已经过时了,但是对于通过搜索遇到此问题的任何人来说,这里是解决方案(至少在 Rails 5 中)。

关键在于 Rails 围绕文件夹和类名称的魔力。因为acts-as-taggable-on在ActsAsTaggableOn命名空间下创建模块,所以需要在名为的子文件夹中创建装置acts_as_taggable_on

夹具数据

在装置文件夹下,与标记相关的装置应位于此处指示的路径中:

# acts_as_taggable_on/taggings.yml
one:
  tag: one
  taggable: onetag1 (Lead)
two:
  tag: two
  taggable: onetag2 (Lead)

# acts_as_taggable_on/tags.yml
one:
  name: "Tag one"
two:
  name: "Tag two"
Run Code Online (Sandbox Code Playgroud)

测试用例中的夹具

要检索测试用例中的标签或标签,请使用以下命令:

setup do
  @tag = acts_as_taggable_on_tags(:one)
  @tagging = acts_as_taggabe_on_taggings(:one)
end
Run Code Online (Sandbox Code Playgroud)