Take the 2-minute tour ×

Hi (huge Rails newbie here), I have the following models:

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


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

When I'm about to create a new shop, I get the following error:

private method `create' called for nil:NilClass

This is my controller:

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

I've tried different variations by reading guides and tutorials here and there, but I'm more confused than before and can't get it to work. Any help would be greatly appreciated.

share|improve this question
Edited question title to reflect question. Duplicate of Using build with a has_one association in rails –  Marc-André Lafortune May 9 '12 at 18:53
add comment

2 Answers

up vote 21 down vote accepted

First of all, here is how to do what you want:

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

Now here's why your version did not work:

You probably thought that this might work because if User had a has_many relation to Shop, @user.shops.create(params[:shop]) would work. However there is a big difference between has_many relations and has_one relations:

With a has_many relation, shops returns an ActiveRecord collection object, which has methods that you can use to add and remove shops to/from a user. One of those methods is create, which creates a new shop and adds it to the user.

With a has_one relation, you don't get back such a collection object, but simply the Shop object that belongs to the user - or nil if the user doesn't have a shop yet. Since neither Shop objects nor nil have a create method, you can't use create this way with has_one relations.

share|improve this answer
Thanks for your answer, sepp2k. I see now why my code couldn't work. –  Neko Oct 1 '10 at 14:21
You could also use @user.create_shop(params[:shop]). See methods added by has_one. –  nates Apr 8 '13 at 21:01
The answer chosen works, but @nates solution works also. +1 to both of you. –  nfriend21 Jul 2 '13 at 1:38
+1 to the answer because I was wondering the same, +1 to the answer for explaining why this is and +1 to the comment for giving the best solution. –  deivid Jul 3 '13 at 16:54
@nates answer is the correct one –  Orlando Nov 1 '13 at 5:07
add comment

A more concise way to do this is with:


See methods added by has_one in the Ruby on Rails guides.

share|improve this answer
add comment

Your Answer


