Rails:在has_one关联上创build

嗨(巨大的Rails新手在这里),我有以下型号:

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

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

当我即将创build一家新店时,出现以下错误:

 private method `create' called for nil:NilClass 

这是我的控制者:

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

我已经尝试了不同的变化,阅读指南和教程在这里和那里,但我比以前更困惑,不能得到它的工作。 任何帮助将不胜感激。

首先,这里是如何做你想要的:

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

现在这就是为什么你的版本不工作:

您可能认为这可能会起作用,因为如果用户与Shop有一个has_many关系, @user.shops.create(params[:shop]) 就可以工作。 但has_many关系和has_one关系有很大的区别:

有了has_many关系, shops将返回一个ActiveRecord集合对象,该对象具有可用于向/从用户添加和删除商店的方法。 其中一种方法是create ,创build一个新的商店,并将其添加到用户。

使用has_one关系,您不会收回这样的收集对象,而只是属于该用户的Shop对象 – 如果用户尚未有商店,则返回nil。 由于Shop对象和nil都没有create方法,因此不能使用has_one关系create此方法。

更简洁的方法是:

 @user.create_shop(params[:shop]) 

在Ruby on Rails指南中查看由has_one添加的方法 。

如果你想save而不是create两种方法:

 shop = @user.build_shop shop.save shop = Show.new shop.user = @user shop.save