我在模型中试过这个:
field :_id, type: String, default: ->{ title.gsub(' ', '_') }
但是,此测试在a = Article.new
上失败了:
test 'invalid without a name' do
a = Article.new
assert !a.valid?, "Title is not being validated"
end
使用:
1) Error:
ArticleTest#test_invalid_without_a_name:
NoMethodError: undefined method `gsub' for nil:NilClass
app/models/article.rb:3:in `block in <class:Article>'
test/models/article_test.rb:6:in `new'
test/models/article_test.rb:6:in `block in <class:ArticleTest>'
答案 0 :(得分:1)
潜在的问题是,它试图在_id
之前分配默认title
。您需要title
才能计算_id
,因此您需要推迟计算_id
,直到您认为自己有标题为止。也许before_validation
钩子比默认更有意义:
field :_id, type: String
before_validation :compute_the_id, :unless => :_id
#...
def compute_the_id
self._id = title.gsub(' ', '_') if(title)
end
然后你就会有平常的&#34;确保我们有一个标题&#34;验证
据推测,您的标题字段无法更改,或者您会遇到title
和_id
不匹配或您正在创建的奇怪案例当title
发生变化或者您有大量机制来处理_id
更改时,全新的文档。你可能会猜到我推荐你的_id
计划;如果你让Mongoid以自己的方式处理_id
,然后为URL等添加一个单独的title-slug,你可能总体上会有更好的时间。