嗨(巨大的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
当我即将创建一个新商店时,我收到以下错误:
private method `create' called for nil:NilClass
这是我的控制者:
@user = current_user
@shop = @user.shop.create(params[:shop])
我通过阅读指南和教程尝试了不同的变化,但我比以前更困惑,无法让它工作。任何帮助将不胜感激。
答案 0 :(得分:189)
答案 1 :(得分:104)
首先,这是如何做你想要的:
@user = current_user
@shop = Shop.create(params[:shop])
@user.shop = @shop
现在这就是你的版本无效的原因:
您可能认为这可能有效,因为如果用户与商店有has_many
的关系,@user.shops.create(params[:shop])
会工作。但是has_many
关系和has_one
关系之间存在很大差异:
使用has_many
关系时,shops
会返回一个ActiveRecord集合对象,该对象具有可用于向/从用户添加和删除商店的方法。其中一种方法是create
,它会创建一个新商店并将其添加给用户。
使用has_one
关系,您不会返回这样的集合对象,而只是属于用户的Shop对象 - 如果用户还没有商店,则为零。由于Shop对象和nil都没有create
方法,因此您无法以create
方式使用has_one
关系。
答案 2 :(得分:7)
如果您想要save
而不是create
,还有两种方式:
shop = @user.build_shop
shop.save
shop = Show.new
shop.user = @user
shop.save
答案 3 :(得分:0)
只需添加到以上答案-
@user.create_shop(params[:shop])
以上语法创建新记录,但随后删除相似的现有记录。
或者,如果您不想触发删除回调
Shop.create(user_id: user.id, title: 'Some unique title')
此thread可能会有所帮助。 Click here