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