2013-12-09 16 views
3

使用Rails gem「friendly_id」,是否可以獲得要創建的子彈的「實時預覽」?在保存對象之前,這是(並在使用ajax請求鍵入時返回)?Rails gem「friendly_id」:如何在創建對象之前獲得子彈的實時預覽

如果是這樣,怎麼樣?

+0

委員會必須詢問您是否已經閱讀了源代碼,查看了自動化測試,調試了一個'.save()'調用等...... – Phlip

+0

被告的知識可能不像陪審團所要求的那樣先進,但他懇求:無罪。 – TomDogg

回答

9

FriendyId作者在這裏。

FriendlyId內部使用私人set_slug來做到這一點。此方法通過回調調用before_validation。如果由於某種原因,你不希望調用valid?,則可以通過send調用set_slug方法,或者定義模型中的一個方法,調用它:

instance = ModelClass.new 
instance.send(:set_slug) 

# or 
class ModelClass < ActiveRecord::Base 
    friendly_id :name, use: :slugged 

    def generate_slug_preview 
    set_slug 
    end 
end 

但是請注意,繞過或忽略驗證往往是餿主意。例如,如果您的模型包含對name字段的驗證,然後您將該字段用作slu basis的基礎,那麼您將預覽永遠不會實際生成的slu slu。

+3

FriendyId作者很友善! :) – TomDogg

1

https://github.com/norman/friendly_id/blob/master/test/slugged_test.rb ...

m1 = model_class.new :name => "a b c d" 
    m1.valid? 
    assert_equal "a-b-c-d", m1.slug 

看起來它只是.slug。根據其他測試,您不需要create - 一個new會做。所以,你的策略是:

  • 每個用戶改變它的時候添加onchange處理文本字段
  • ,使用Ajax的電流值發送到服務器
  • new模型的實例,用名稱或任何設置爲值阿賈克斯發送
  • 呼叫slug,並將結果發送回網頁
  • 顯示它在網頁中

所有這些都是標準的Ajax內容,與friendly_id無關。但這一切都讓我懷疑 - 是否因爲你向用戶展示了slu - - friendly_id可以讓你編輯slu,,就像高端博客一樣。

而你可能必須先致電valid?

+0

感謝 - 不幸的是,調用像'''Article.new(title:「一個新的文章」)。slug'''返回零... – TomDogg

+0

您的解決方案是正確的(它返回nil b/c我的模型有驗證失敗的B/C我只通過它爲生成slu needed所需的屬性的一個值)。所以,我必須進行所有驗證條件,即'''validates:name,除非:: on_the_fly''',然後添加到模型'''attr_accessor:on_the_fly''並且提交一個'''true' 「價值,每次用戶ajax提交他們的價值 - slugged。 (另一方面,這似乎並不安全,因爲它允許任何人繞過驗證。) – TomDogg

+0

Tx但該解決方案很糟糕。 Rails驗證很糟糕,因爲驗證屬於表單而不是模型。 (不同的用戶,看到不同的形式,例如可能會遇到不同的驗證。)因此,friendly_id不應該要求.valid?呼叫通過只是爲了生成一個slu。。 – Phlip

相關問題