gpt4 book ai didi

ruby-on-rails - 验证和测试 Rails 3 关联的完美方式(使用 RSpec/Remarkable)?

转载 作者:行者123 更新时间:2023-12-03 14:50:38 25 4
gpt4 key购买 nike

我对在 Rails 3 中进行测试仍然很陌生,我使用 RSpec 和 Remarkable。我已经阅读了很多帖子和一些书籍,但我仍然不确定何时使用该协会的名称,何时使用它的 ID。

class Project < ActiveRecord::Base
has_many :tasks
end

class Task < ActiveRecord::Base
belongs_to :project
end

由于良好的实践,我想保护我的属性免受大量分配:
class Task < ActiveRecord::Base
attr_accessible :project # Or is it :project_id??

belongs_to :project
end

首先,我要确定一个项目 从不 在没有有效任务的情况下存在:
class Task < ActiveRecord::Base
validates :project, :presence => true # Which one is the...
validates :project_id, :presence => true # ...right way to go??
end

我还想确保分配的项目或项目 ID 始终有效:
class Task < ActiveRecord::Base
validates :project, :associated => true # Again, which one is...
validates :project_id, :associated => true # ...the right way to go?
end

...当我使用 :related 时,我是否需要对 :presence 进行验证?

非常感谢您的澄清,似乎经过数小时的阅读和尝试使用 RSpec/Shoulda/Remarkable 测试东西后,由于所有树木,我再也看不到森林了...

最佳答案

这似乎是正确的方法:

attr_accessible :project_id

你不必把 :project还有!无论如何都可以做 task.project=(Project.first!)
然后检查 :project_id 是否存在使用以下内容(当使用 :project_id 时也会设置 task.project=(...)):
validates :project_id, :presence => true

现在确保关联的项目是有效的,如下所示:
validates :project, :associated => true

所以:
t = Task.new
t.project_id = 1 # Value is accepted, regardless whether there is a Project with ID 1
t.project = Project.first # Any existing valid project is accepted
t.project = Project.new(:name => 'valid value') # A new valid project is accepted
t.project = Project.new(:name => 'invalid value') # A new invalid (or an existing invalid) project is NOT accepted!

有点可惜的是通过 t.project_id =分配ID的时候不会检查此特定 ID 是否真的存在。您必须使用自定义验证或使用 Validates Existence GEM 来检查这一点。 .

要使用带有 Remarkable 匹配器的 RSpec 测试这些关联,请执行以下操作:
describe Task do
it { should validate_presence_of :project_id }
it { should validate_associated :project }
end

关于ruby-on-rails - 验证和测试 Rails 3 关联的完美方式(使用 RSpec/Remarkable)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11327390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com