Jason
Jason

Reputation: 23395

Rails 3.2 - Why is simple_form is not generating any markup for my nested attributes?

I've spent about 5 straight hours at this and keep ending up back at square one...time to ask for time help!

I am using Rails 3.2, devise and simple_form, I am trying to build a form that will allow a user to register (email, password) & allow them to create a simple listing object - all on the one page. However none of my nested attributes for the user are appearing on the markup when the /listings/new page loads & I cannot figure out why.

Here is what I have:

Listing controller:

def new
  @listing = Listing.new

  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @listing }
  end
end

Listing model:

class Listing < ActiveRecord::Base
  has_one :address
  belongs_to :category
  belongs_to :user

  accepts_nested_attributes_for :address
  accepts_nested_attributes_for :user
end

User model:

class User < ActiveRecord::Base
  has_many :listings
  devise :database_authenticatable, :registerable, :validatable
  attr_accessible :email, :password, :password_confirmation, :remember_me

end

New Listings Form:

<%= simple_form_for(@listing) do |f| %>

<%= f.label :listing_type %>
<%= f.collection_select :listing_type, [["Creative","Creative"]], :first, :last%>

  <%= f.simple_fields_for :user do |u| %>
    <%= u.label :email %>
    <%= u.input_field :email %>

    <%= u.label_for :password %>
    <%= u.input_field :password %>

    <%= u.label_for :password_confirmation %>
    <%= u.input_field :password_confirmation %>
  <% end %>

<% end %>

My head is melted looking at this, any help is much appreciated!

Upvotes: 0

Views: 1253

Answers (2)

onurozgurozkan
onurozgurozkan

Reputation: 1794

You need a new User object.

Change

  <%= f.simple_fields_for :user do |u| %>

to

  <%= f.simple_fields_for :user, User.new do |u| %>

It should be work.

Upvotes: 1

varatis
varatis

Reputation: 14740

Railscasts' Nested Model Form would be a good tutorial for you.

Also, what it sounds like you'd want to do is call Users#new, not Listings#new. Usually you make a form for the thing (User) which has_many of something else (Listings). So you want to make a form for a new User, not a new listing. If you take this route, then in Users#new in your controller, do something like

@user = User.new
@user.listings.build
....

If you want to keep it how it is, you might be able to do

@listing.user.build

But I'm not sure if that'll work since you're doing it in the opposite direction as I described above.

Upvotes: 1

Related Questions