开发者

Rails 3 Nested Forms - Multi-Level

开发者 https://www.devze.com 2023-03-05 00:44 出处:网络
I have the following models defined in my application User Profile Address Here is my user model: class User < ActiveRecord::Base

I have the following models defined in my application

  • User
  • Profile
  • Address

Here is my user model:

class User < ActiveRecord::Base

  # Include default devise modules. Others available are:
  # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :profile_attributes

  has_one :profile
  accepts_nested_attributes_for :profile
end

Here is my profile model:

class Profile < ActiveRecord::Base

  attr_accessible :first_name, :last_name, :organization, :telephone_number, :user_id, :address_attributes

  belongs_to :user
  has_one :address

  accepts_nested_attributes_for :address
end

Here is my address model:

class Address < ActiveRecord::Base
  attr_accessible :street, :street_cont, :city, :state, :zip_code
  belongs_to :profile
end

I am using devise for authentication so in my view I have the following for registration:

<% resource.build_profile %>
<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :email %><br />
  <%= f.email_field :email %></p>

  <p><%= f.label :password %><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></p>

  <%=f.fields_for :profile do |profile_form| %>
      <p><%= profile_form.label :first_name %><br />
      <%= profile_form.text_field :first_name %></p>

      <p><%= profile_form.label :last_name %><br />
      <%= profile_form.text_field :last_name %></p>

      <p><%= profile_form.label :organization %><br />
      <%= profile_form.text_field :organization %></p>

      <p><%= profile_form.label :telephone_number %><br />
      <%= profile_form.text_field :telephone_number %></p>

      <%=f.fields_for :address do |address_form| %>
        <p><%= address_form.label :street %><br />
      开发者_开发问答  <%= address_form.text_field :street %></p>

        <p><%= address_form.label :street_cont %><br />
        <%= address_form.text_field :street_cont %></p>

        <p><%= address_form.label :city %><br />
        <%= address_form.text_field :city %></p>

        <p><%= address_form.label :state %><br />
        <%= address_form.text_field :state %></p>

        <p><%= address_form.label :zip_code %><br />
        <%= address_form.text_field :zip_code %></p>
     <% end %>
  <% end %>

  <p><%= f.submit "Sign up" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>

The form renders correctly but when I view the source I see this for the address fields:

<input id="user_address_street" name="user[address][street]" size="30" type="text" />

for the profile section I see:

<input id="user_profile_attributes_first_name" name="user[profile_attributes][first_name]" size="30" type="text" />

When I save the form, the user and profile are saved to the database but not the address. I'm obviously doing something wrong possibly with my model relationships but I don't know how to go about solving this.

Any help would be appreciated.


Change this:

 <%=f.fields_for :address do |address_form| %>

To this:

<%=profile_form.fields_for :address do |address_form| %>
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号