2012-02-27 33 views
0

我有一個mongoid模型,說的網頁,這是這樣的:如何在保存爲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

當談到回調時,尤其是當它像「在保存對象之前更新/設置字段」這樣的東西時,我有些蠢蠢欲動。我發現使用before_validation會使這類錯誤消失,至少我嘗試過幾次。雖然我想在某些時候理解爲什麼,我錯過了定期回調&我做錯了什麼。

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 
+0

是'self.short_link'的正確訪問者?我只用'short_link'。 – 2012-02-28 03:50:25

+1

當前範圍內的'self'是網頁的一個實例,它是正確的訪問者。 – Voldy 2012-02-28 08:42:14

+0

是的,應該在這裏使用rails回調,默認情況下:如果應用了零值(例如,來自工廠方法),則Mongoid上的值不會設置該字段。我會。但是,大部分使用before_validation回調代替 – Houen 2013-12-18 08:39:51

1

按照Mongoid docs for Callbacks,它只激發您正在執行的操作的回調。這就是爲什麼它沒有射擊。您需要按照Voldy的回答,使用before_create回撥。

但是,如果這是所有你正在做的(你的代碼是不是更復雜的),然後,而不是設置short_link,如果它是不是已經分配的,你可以只設置爲這樣的默認:

class Webpage 
    include Mongoid::Document 

    field :short_link, type: String, default: -> { rand(36**8).to_s(36) } 
    field :actual_link, type: String 

end 

這將與您當前的代碼的行爲相同。

+0

我嘗試過使用Webpage.new,然後保存!它仍然不起作用。回調被觸發,但短鏈接字段未設置。 short_link是short_link字段的正確訪問者嗎?我嘗試了'self.short_link'並且事情有效,但self.short_link對我來說似乎是錯誤的。 – 2012-02-28 03:42:53

+0

您通常需要'self.short_link',但通過我的解決方案,您不必擔心回調。 'Webpage.new'會創建一個新的'Webpage',其中'short_link'或者在創建時由你設置,或者如果你沒有提供值,則由lambda的結果設置。 – 2012-02-28 08:19:58

+0

我的意思是'Webpage.create'而不是'Webpage.new',昨晚有點太累了。 – 2012-02-28 13:57:54

相關問題