ActiveModel :: MissingAttributeError:抛出测试而不是控制台
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveModel :: MissingAttributeError:抛出测试而不是控制台相关的知识,希望对你有一定的参考价值。
我是Rails的新手,我正在尝试建立一个非常简单的模型。有三种模型类:Solution,Pro和Con。优点和缺点是这样的解决方案的孩子:
class Solution < ActiveRecord::Base
include BasicValidations
has_many :pros
has_many :cons
end
和
class Con < ActiveRecord::Base
belongs_to :solution
end
class Pro < ActiveRecord::Base
belongs_to :solution
end
但是,如果我尝试按如下方式运行测试:
def setup
@test_class = Solution
@solution = FactoryGirl.create(:solution)
end
test "Solutions can take pros" do
c = @solution.pros.create(description: "pros")
assert_includes(@solution.pros, c,"Could not add pro to solution")
end
我收到以下错误:
2) Error:
SolutionTest#test_Solutions_can_take_pros:
ActiveRecord::UnknownAttributeError: unknown attribute 'solution_id' for Pro.
test/models/solution_test.rb:12:in `block in <class:SolutionTest>'
...但仅在某些时候,如果在rails控制台中手动执行相同的测试!
这是数据库迁移:
class AddProsAndConsToSolution < ActiveRecord::Migration
def change
change_table :pros do |t|
t.belongs_to :solution, index: true
end
change_table :cons do |t|
t.belongs_to :solution, index: true
end
end
end
......和架构:
ActiveRecord::Schema.define(version: 20150323133049) do
create_table "cons", force: :cascade do |t|
t.datetime "created_at"
t.datetime "updated_at"
t.string "description", limit: 255
t.integer "solution_id"
end
add_index "cons", ["solution_id"], name: "index_cons_on_solution_id"
create_table "pros", force: :cascade do |t|
t.string "description", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
t.integer "solution_id"
end
add_index "pros", ["solution_id"], name: "index_pros_on_solution_id"
create_table "solutions", force: :cascade do |t|
t.string "description", limit: 255
t.datetime "created_at"
t.datetime "updated_at"
end
end
我正在运行Rails 4.2.1。
有什么想法吗?看起来很简单,我一定错过了一些明显的东西,但它偶尔在测试和控制台中工作的事实让我感到困惑。
尝试使用rake db:reset RAILS_ENV=test
,它将丢弃现有数据库(rake db:drop
),重新创建它(rake db:create
),加载从当前开发db条件(rake db:schema:load
)检索的模式,并播种数据库(rake db:seed
),所有这些只在test
数据库配置中,在config / database.yml文件中确定,并通过将RAILS_ENV
全局变量设置为test
来设置。
如果在rails控制台中手动执行相同的测试
它起作用,因为测试在测试RAILS_ENV中运行,并且您的控制台处于开发RAILS_ENV中。
您可以通过键入以下命令来访问测试环境的控制台:rails console test
。
你完成了迁移测试数据库的工作吗?
rake db:migrate RAILS_ENV=test
以上是关于ActiveModel :: MissingAttributeError:抛出测试而不是控制台的主要内容,如果未能解决你的问题,请参考以下文章
在 ActiveModel::Serializer 中序列化错误哈希
是否可以在 Rails 控制器之外使用 ActiveModel::Serializers?
rails create方法ActiveModel::ForbiddenAttribute的问题