我正在嘗試為position在Product保存物件之前命名的屬性分配一個亂數。我無法讓回呼正常作業。控制臺中沒有錯誤,只是默默地失敗了。
這是我的模型
class Product < ApplicationRecord
validates_presence_of :position
before_save {
assign_position
}
private
def assign_position
self.position = rand(150)
end
end
這是我的架構
create_table "products", force: :cascade do |t|
t.string "name"
t.integer "position"
end
這是我用來測驗 before save 回呼的示例種子。
Product.create(name: "Rose Deep Hydration Facial Toner")
創建種子后檢查時沒有錯誤,但控制臺輸出
irb(main):079:0> Product.find_by_name("Rose Deep Hydration Facial Toner").position
Product Load (1.8ms) SELECT "products".* FROM "products" WHERE "products"."name" = $1 ORDER BY "products"."created_at" DESC LIMIT $2 [["name", "Rose Deep Hydration Facial Toner"], ["LIMIT", 1]]
=> nil
我在應用程式中有其他回呼作業得很好。我無法弄清楚為什么這個不起作用。
uj5u.com熱心網友回復:
您的問題是在before_save觸發回呼之前進行驗證。你有這個:
validates_presence_of :position
但在檢查驗證時position仍將nil是。
我認為您想使用before_validation回呼而不是before_save:
class Product < ApplicationRecord
before_validation :assign_position
validates_presence_of :position
private
def assign_position
self.position = rand(150)
end
end
請記住,assign_position每次驗證產品時都會呼叫它,因此更新名稱中的錯字(例如)將更改position. 如果該位置已經設??置或者您正在更改現有實體,則您可能希望不理會該位置。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/366137.html
標籤:红宝石轨道 红宝石 打回来 rails-activerecord
上一篇:為在WSL環境中運行的Rails專案配置水豚時,如何指定chrome.exe的路徑?
下一篇:RubyonRails連接鍵和值
