理想我希望網址看起來像:FriendlyId觸發BEFORE模型驗證。我如何解決這個問題?
/用戶/約翰-S
/用戶/富-B
/用戶/布拉德-P
我有一個用戶模型看起來是這樣的:
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :name, :use => :slugged
validates :first_name, :presence => true
validates :last_name, :presence => true
# "John Smith" becomes "John S."
def name
"#{self.first_name.capitalize} #{self.last_name[0].capitalize}."
end
end
的不良行爲最好與此控制檯輸出解釋說:
[15] pry(main)> User.new(first_name: nil, last_name: nil).save!
(0.2ms) BEGIN
(0.1ms) ROLLBACK
NoMethodError: undefined method `capitalize' for nil:NilClass
問題(最後! :))
看來發生了什麼是FriendlyId被調用之前我的驗證first_name
和last_name
觸發。這導致name
方法pooping大寫時調用一個零值。
我該怎麼做才能讓我的驗證在FriendlyId被調用之前觸發?並且實際上進一步......爲什麼在建立任何有效性之前,FriendlyId都參與其中?
謝謝!
謝謝你的回覆。 –
任何可能不需要monkeypatching的替代方法的建議? –
我可能會重新定義'name',並且只有在設置了第一個和最後一個時才返回一個有效的名稱。由於驗證,這應該只發生在需要有效的slu before之前。 –