.Build, .create ve .create! Arasındaki farklar! ve ne zaman kullanılmalıdır?


167

Bu yüzden .build, insanların son zamanlarda .create, ve .create!kontrolörleri içinde gittikçe daha fazla kullandıklarını görüyorum. .newParam'd nesnesini kullanmanın ve geçmenin farkı nedir .save? Artıları ve eksileri var mı? Bu diğer yöntemleri kullanmak fayda sağlıyor mu?

Yanıtlar:


234

Birkaç fark var, ancak büyük değiller:

  1. .createeşdeğerdir .newardından .save. Sadece daha özlü.
  2. .create!eşdeğerdir .newve ardından .save!(tasarruf başarısız olursa bir hata verir). Aynı zamanda biraz daha kısa
  3. Bence .buildolduğunu çoğunlukla için bir takma .new. Bu bir Rails 3 şekilde çalışır ve Rails başka bir yol <3.x

Ancak en önemli kısım, bu yöntemlerin has_manyiki modeli otomatik olarak bağlamak için bir ilişkilendirme ( , vb.) Aracılığıyla çağrılabilmesidir .


1
İlişkili modelleri onlarla ilişkilendirebileceğinden bahsettiğim için bunu en doğru cevap olarak seçtim - bu, .new ve .save kullanarak düşündüğüm ilginç ve önemli bir fark. Bu biraz daha fazla iş gerektiriyor. Teşekkürler.
Tim Knight

11
3 - yapı hakkında küçük açıklama sadece yeniden biraz daha fazlasını yapar - aynı zamanda ilişkilendirme bağlantısını da ayarlar.
Two Bit Gangster

116
Yapı, Yeni'den farklıdır. Ancak fark, ilişkilendirme bağlantısını ayarlaması değildir (New, bunu yeni örnek için de yapar). Fark, Build'ın arayanı yeni örnekle doldurması, ancak Yeni'nin doldurmamasıdır. Yani örneğin: Wall.posts.new size Duvarınızla ilişkili yeni bir yayın verir, ancak Wall.posts bu çağrıdan sonra hala boştur. Wall.posts.build, Duvarınızla ilişkili yeni bir gönderi sağlar ve Wall.post'larınızın artık bir yayını vardır.
Amin Ariana

3
Özel bir işlevi olmayan artık sadece bir takma ad değil mi?
Gabriele Cirulli

14
Rails 4'te, sadece konsolda kontrol ettim. wall.posts.new ve wall.posts.build, duvar nesnesini tamamen aynı şekilde dolduruyor. Wall.posts.new'den sonra anlamına gelir, wall.posts, Amin'in yorumunda iddia edildiği gibi boş değildir.
Bot

35

O doğru olmakla birlikte createaramaları newve daha sonra saveonların dönüş değerleri iki alternatif arasında büyük bir fark vardır.

Savenesnenin veritabanına başarıyla kaydedilip kaydedilmediğine bağlı olarak trueveya döndürür false. Bu daha sonra yukarıdaki sorudaki ilk örneğe göre akış kontrolü için kullanılabilir.

Createnesnenin kaydedilip kaydedilmediğine bakılmaksızın modeli döndürür. Bu, yukarıdaki kod için, ifnesnenin doğrulamalarda başarısız olmasına ve kaydedilmemesine rağmen , ifadenin üst dalının her zaman yürütüleceğinden kaynaklanır.

Eğer kullanırsanız createmantığını dallanma ile kullandığınız takdirde durum olmadığı sessiz başarısızlık riski vardır new+ save.

create! kayıt geçersiz olduğunda aynı sorundan ve istisnadan muzdarip değildir.

createBurada bir alternatif kontrol yararlı olabilir respond_withAPI (JSON / XML) yanıtlar için kullanılır. Bu durumda, nesnede hataların varlığı, unprocessable_entitybir API durumundan tam olarak istediğiniz bir durumla yanıtta hataların döndürülmesine neden olur .

Özellikle akış kontrolü için dönüş değerine güveniyorsanız, her zaman html için new+ saveseçeneğini kullanırdım .


6

#create, yeninin ve kaydetmenin daha kısa sürümüdür. #oluşturmak! doğrulama olumlu değilse istisna atıyor.


5

Yukarıdaki cevapları ikinci olarak verirdim. Ayrıca create, kişi yapabileceğiniz falsebir argüman olarak geçemez save. Bağımsız falsedeğişken olarak geçmek tüm ray onaylarını atlayacaktır

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.