如果我假設模型:
class User < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :user
end
當我嘗試運行時User.first.posts.create [attributes],模型被創建,但它的 id 為 nil 并且沒有保存在資料庫中。誰能解釋一下為什么?我認為這種行為應該來自#new,而不是#create。
uj5u.com熱心網友回復:
你的期望是錯誤的。
如果驗證通過,則創建一個物件(或多個物件)并將其保存到資料庫中。無論物件是否成功保存到資料庫,都會回傳結果物件。
實作實際上非常簡單:
def create(attributes = nil, &block)
if attributes.is_a?(Array)
attributes.collect { |attr| create(attr, &block) }
else
object = new(attributes, &block)
object.save
object
end
end
例如,當您執行以下操作時:
post = Post.create(title: 'Not a valid post')
這將始終回傳一個 post 實體。如果您隨后檢查該物件,您可以看到它沒有持久化,并且該errors物件會告訴您原因:
post.valid? # false
post.persisted? # false
post.errors.full_messages # ["User can't be blank."]
如果您從關聯創建記錄,那么您也在改變它:
user = User.first
post = user.posts.create(attributes)
user.posts.to_a.include?(post) # true
這可能看起來像是不受歡迎的行為,但嵌套屬性需要正常作業。
create!在非互動式背景關系(如種子檔案)中使用(如果記錄無效,則會引發錯誤),而不應該在創建記錄失敗的情況下使用。不要在控制器中使用它,因為無效輸入不是例外事件 - 并且它只是一個拐杖,類似于在代碼中拋出一堆日志或放置陳述句。撰寫覆寫無效和有效輸入的測驗。
如果您真的需要使用除錯器,例如byebug或pry進入控制器操作并檢查模型實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/342934.html
下一篇:按id添加元素時過濾
