运行 使用 gem 特定方法的自定义验证
Running custom validations with gem specific methods
我设置了一个自定义验证,用于检查用户是否在提交评论之前为相册投票。验证在客户端运行良好,但是当涉及到 运行 宁我的 Rspec 测试时,我似乎 运行 遇到了一些问题。
验证使用 Acts As Votable gem 的 voted_for? 方法。不幸的是,这就是事情变坏的地方。对于我的非自定义验证(顺便说一句,它确实正常工作)我收到这样的错误:
3) Review validations should ensure body has a length of at least 40
Failure/Error: it { should validate_length_of(:body).is_at_least(40) }
NoMethodError:
undefined method `voted_for' for nil:NilClass
我需要做什么才能识别此方法?
审核模型
class Review < ActiveRecord::Base
belongs_to :album
belongs_to :owner, class_name: "User", foreign_key: :user_id
validates :body, presence: true, length: { minimum: 40 }
def album_vote
if !owner.voted_for?(album)
errors.add(:review, "requires an album vote before submitting")
end
end
end
评论工厂
FactoryGirl.define do
factory :review do
body { Faker::Lorem.paragraph(2) }
album
association :owner, factory: :user
end
end
您需要确保确实有一个所有者。该错误仅仅是因为您正在调用 nil 并且与 ActsAsVotable
.
没有任何关系
class Review < ActiveRecord::Base
belongs_to :album
belongs_to :owner, class_name: "User", foreign_key: :user_id
validates :body, presence: true, length: { minimum: 40 }
validates :owner, presence: true
def album_vote
# consider raising an error if there is no owner.
if owner && !owner.voted_for(album)
errors.add(:review, "requires an album vote before submitting")
end
end
end
然后更改您的工厂定义以创建所有者:
FactoryGirl.define do
factory :user, aliases: [:owner] do
# ...
end
end
FactoryGirl.define do
factory :review do
body { Faker::Lorem.paragraph(2) }
album
owner
end
end
我设置了一个自定义验证,用于检查用户是否在提交评论之前为相册投票。验证在客户端运行良好,但是当涉及到 运行 宁我的 Rspec 测试时,我似乎 运行 遇到了一些问题。
验证使用 Acts As Votable gem 的 voted_for? 方法。不幸的是,这就是事情变坏的地方。对于我的非自定义验证(顺便说一句,它确实正常工作)我收到这样的错误:
3) Review validations should ensure body has a length of at least 40
Failure/Error: it { should validate_length_of(:body).is_at_least(40) }
NoMethodError:
undefined method `voted_for' for nil:NilClass
我需要做什么才能识别此方法?
审核模型
class Review < ActiveRecord::Base
belongs_to :album
belongs_to :owner, class_name: "User", foreign_key: :user_id
validates :body, presence: true, length: { minimum: 40 }
def album_vote
if !owner.voted_for?(album)
errors.add(:review, "requires an album vote before submitting")
end
end
end
评论工厂
FactoryGirl.define do
factory :review do
body { Faker::Lorem.paragraph(2) }
album
association :owner, factory: :user
end
end
您需要确保确实有一个所有者。该错误仅仅是因为您正在调用 nil 并且与 ActsAsVotable
.
class Review < ActiveRecord::Base
belongs_to :album
belongs_to :owner, class_name: "User", foreign_key: :user_id
validates :body, presence: true, length: { minimum: 40 }
validates :owner, presence: true
def album_vote
# consider raising an error if there is no owner.
if owner && !owner.voted_for(album)
errors.add(:review, "requires an album vote before submitting")
end
end
end
然后更改您的工厂定义以创建所有者:
FactoryGirl.define do
factory :user, aliases: [:owner] do
# ...
end
end
FactoryGirl.define do
factory :review do
body { Faker::Lorem.paragraph(2) }
album
owner
end
end