2010-10-01 31 views
61

Hi (büyük Raylar burada newbie) oluşturun aşağıdaki modelleri var:Raylar: has_one dernek üzerinde

class Shop < ActiveRecord::Base 
    belongs_to :user 
    validates_uniqueness_of :title, :user_id, :message => "is already being used" 
end 

ve

class User < ActiveRecord::Base 
    has_one :shop, :dependent => :destroy 
end 

Ben yeni alışveriş oluşturmak üzereyim

, ben aşağıdaki hatayı alıyorum:

:

private method `create' called for nil:NilClass 

Bu benim denetleyicisi olan

@user = current_user 
@shop = @user.shop.create(params[:shop]) 

Burada ve orada rehberleri ve öğreticileri okuyarak farklı varyasyonları denedim, ancak daha önce olduğundan daha karışıkım ve işe yaramayacağım. Herhangi bir yardım büyük takdir edilecektir.

@user = current_user 
@shop = Shop.create(params[:shop]) 
@user.shop = @shop 

Şimdi burada versiyonu işe yaramadı yüzden:

Muhtemelen Kullanıcı bir has_many olsaydı bu çünkü işe yarayabilecek düşündüm hepsinden

+0

Düzenlenen Soru başlığı soru yansıtmak için. [Radarda bir has_one ilişkilendirmesi ile oluşturma] 'nın (http://stackoverflow.com/questions/2472982/using-build-with-a-has-one-association-in-rails) –

+1

numarasını da kullanabilirsiniz. user.build_shop (params) ' – ImranNaqvi

cevap

82

Öncelikle burada ne istediğinizi nasıl olduğunu Mağaza ile ilişki, @user.shops.create(params[:shop]) çalışır. Eğer bir kullanıcıdan için/dükkan eklemek ve kaldırmak için kullanabileceğiniz yöntemleri vardır bir ActiveRecord koleksiyon nesnesi döndürür shops bir has_many ilişkisi ile

: Ancak has_many ilişkiler ve has_one ilişkiler arasında büyük bir fark vardır. Bu yöntemlerden biri create olup, yeni bir mağaza oluşturur ve kullanıcıya ekler.

Bir has_one ilişkisi ile, böyle bir koleksiyon nesnesine geri dönmezsiniz, ancak yalnızca kullanıcıya ait olan Shop nesnesine geri dönmezsiniz - yoksa kullanıcının henüz bir mağazası yoksa. Ne Shop nesneleri ne de nil create yöntemine sahip olmadığından, create'u has_one ilişkileri ile bu şekilde kullanamazsınız.

@user.create_shop(params[:shop]) 

Raylar kılavuzları Ruby on methods added by has_one bakınız: ile

+0

Cevabınız için teşekkürler, sepp2k. Şimdi neden kodumun işe yaramadığını görüyorum. – Neko

+78

Ayrıca, '@ user.create_shop (params [: shop])' komutunu da kullanabilirsiniz. Bkz. [Has_one] tarafından eklenen yöntemler] (http://guides.rubyonrails.org/association_basics.html#methods-added-by-has_one). – nates

+0

Seçilen cevap çalışır, ancak @nates çözümü de çalışır. Her ikinize de +1. – nfriend21

147

Bunu yapmanın daha özlü bir yoldur.

+3

Bu kesinlikle daha iyi bir yaklaşım – Magnum

+2

Bir önceki mağazayı silecek bir kereden fazla yaratamazsanız dikkat edin. Örneğin, eğer @ @ user.create_shop (params [: shop_one_info]) 'yı çalıştırırsanız, shop_one yaratacaktır, ama eğer ilk @ dükkanı silecekse, @ shop.one-shop (params [: shop_two_info])' yı çalıştırırsanız ikinci. – ecoding5

+0

Önceki mağazanın silinmesi hakkındaki yukarıdaki yorum Rails 3.2.18 içindir, daha yeni sürümler hakkında bilmiyorum. 5 dakika sonra yorumu düzenleyemiyorum -_- – ecoding5

2

iki yolu daha vardır sen save yerine create istiyorsanız:

shop = @user.build_shop 
shop.save 

shop = Show.new 
shop.user = @user 
shop.save 
İlgili konular