我有一个mongoid模型,比如网页,就像这样:
class Webpage
include Mongoid::Document
field :short_link, type: String
field :actual_link, type: String
before_save :generate_short_link
protected
def generate_short_link
short_link ||= rand(36**8).to_s(36)
end
end
但是当我进行Webpage.create时,不会自动填充short_link。我做错了什么?
答案 0 :(得分:1)
您似乎只需要在创建时填充short_link,最好使用before_create
回调。
class Webpage
include Mongoid::Document
field :short_link, type: String
field :actual_link, type: String
before_create :generate_short_link
protected
def generate_short_link
self.short_link = rand(36**8).to_s(36)
end
end
答案 1 :(得分:1)
根据Mongoid docs for Callbacks,它只会触发您正在执行的操作的回调。这就是它没有开火的原因。您需要按照Voldy的说法进行操作,使用before_create
回调。
但是,如果这就是您正在做的所有事情(您的代码并不复杂),那么您可以将其设置为默认设置,而不是设置short_link
,如下所示: / p>
class Webpage
include Mongoid::Document
field :short_link, type: String, default: -> { rand(36**8).to_s(36) }
field :actual_link, type: String
end
这与您当前的代码的行为相同。
答案 2 :(得分:0)
当谈到回调时,我有点像白痴,特别是当它像“在保存对象之前更新/设置字段”之类的东西时。我发现使用before_validation
会让这些错误消失,至少我试过几次。虽然我想在某个时候理解为什么,我经常回调和错过了什么?我做错了什么。