2013-06-03 9 views
2

Я использую камень Devise для аутентификации пользователей. У меня есть модель User и отношение модели Address, где каждый пользователь has_one :address и каждый адрес belongs_to :user. Когда я пытаюсь зарегистрировать нового пользователя, я получаю следующую ошибку при загрузке страницы: unknown attribute: user_id. След указывает на линию <% resource.build_address..., что видно на мой взгляд.Неизвестный атрибут 'user_id' с установленными вложенными атрибутами

Если я просто удалю эту строку из своего представления, страница загрузится, но ни один из полей вложенных форм не появится.

В консоли Rails я могу создать и сохранить адрес, а затем использовать этот сохраненный адрес в качестве атрибута для нового пользователя, который сохранит.

мнение заключается в следующем:

<% resource.build_address unless resource.address %> 
    <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 

    <%= f.email_field :email, :autofocus => true, placeholder: "Your email", class: 'input-block-level' %><br> 
    <%= f.password_field :password, placeholder: "Password", class: 'input-block-level' %><br> 
    <%= f.password_field :password_confirmation, placeholder: "Confirm password", class: 'input-block-level' %><br> 
    <%= f.text_field :favorite_cuisine, placeholder: "Favorite cuisine", class: 'input-block-level' %><br> 
    <%= f.fields_for :address do |address_form| %> 
     <%= address_form.text_field :street_one, placeholder: "Street", class: 'input-block-level' %><br> 
     <%= address_form.text_field :street_two, placeholder: "Street #2", class: 'input-block-level' %><br> 
     <%= address_form.text_field :city, placeholder: "City", class: 'input-block-level' %><br> 
     <%= address_form.text_field :state, placeholder: "State", class: 'input-block-level' %><br> 
     <%= address_form.text_field :zip, placeholder: "zip", class: 'input-block-level' %><br> 
    <% end %> 
<% end %> 

Моя модель Пользователь:

has_one :address, :dependent => :destroy 
accepts_nested_attributes_for :address 

# Include default devise modules. Others available are: 
# :token_authenticatable, :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, 
:favorite_cuisine, :username, :address 

validates_presence_of :email 
validates_presence_of :address 

Моя адресная модель:

belongs_to :user 
attr_accessible :city, :state, :street_one, :street_two, :zip, :user_id 

validates_presence_of :city 
validates_presence_of :state 
validates_presence_of :street_one 
validates_presence_of :zip 

Где я буду здесь не так?

+1

Вы можете проверить в вашей схеме, которая адресует имеет user_id поле? (Держу пари, что нет). –

+0

Вы правы, адреса не имеют поля user_id. Как я должен структурировать свою миграцию, чтобы добавить user_id к адресам и указать ссылку на пользователя? –

ответ

2
rails g migration AddUserIdToAddresses 

Затем отредактируйте файл, и

def change 
    add_column :addresses, :user_id, :integer 
end 

затем грабли БД: мигрировать

0

попробовать что-то вроде этого:

<%= f.fields_for (resource.address || :address), ... %> 

Поскольку форма вложенными, он должен построить новый с формой представления моих знаний.