如何从Mongoid中的自定义ID中删除空格?

时间:2014-10-11 04:39:31

标签: ruby-on-rails mongoid

我在模型中试过这个:

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>'

1 个答案:

答案 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,你可能总体上会有更好的时间。