Ruby on Rail: добавить полиморфный адрес пользователю Devise - PullRequest
2 голосов
/ 14 октября 2011

ROR новичок здесь. : -)

Я использую Devise для аутентификации и добавил first_name и last_name в модель User, созданную devise. Я также создал модель адреса:

create_table: адреса делают | t | t.string: line1 t.string: line2 t.string: город t.string: состояние t.integer: addressable_id t.string: addressable_type

  t.timestamps
end

add_index :addresses, [:addressable_type, :addressable_id], :unique => true 

конец


частичное в views / shared / _address.html.erb






user.rb

has_one: address,: as =>: адресуемый

# Включить модули разработки по умолчанию. Другие доступные: #: token_authenticatable,: encryptable,: подтвердимый,: блокируемый,: timeoutable и: omniauthable devise: database_authenticatable,: registerable, : извлекаемый,: запоминаемый,: отслеживаемый,: проверяемый

# Настройка доступных (или защищенных) атрибутов для вашей модели attr_accessible: электронная почта,: пароль,: подтверждение пароля,: Remember_me,: имя,: фамилия attr_accessible: address_attributes

accept_nested_attributes_for: address,: update_only => true

добавил следующие строки в views / devise / registrations / new.html.erb и edit.html.erb


<% f.fields_for: address do | address |%> <% = render: частичный => «общий доступ / адрес»,: locals => {: f => адрес}%>

<% end%>

<% end%>


<% f.fields_for: address do | address |%> <% = рендер: частичный => «общий доступ / адрес»,: locals => {: f => адрес}%>

<% end%>

<% end%>


Теперь я хочу, чтобы Devise создал адрес при регистрации нового пользователя. И пользователь может заполнить адрес после входа в систему. Видимо, что-то не хватает, или я делаю это неправильно. Поля адреса не отображаются при входе в систему и не редактируются.

Пожалуйста, поделитесь своей мудростью. Заранее спасибо.

1 Ответ

3 голосов
/ 14 октября 2011

Общее поведение fields_for заключается в том, что связанный объект не будет отображаться в форме, если он уже не существует. Например. если бы мы говорили вне контекста Devise, чтобы получить адрес, который будет отображаться в новой пользовательской форме, у вас будет что-то вроде:

# users_controller.rb
def new
   @user = User.new
   @user.address = Address.new
end

, а затем адрес будет отображаться в форме.

Учитывая, что это управляемая Devise форма, и у вас нет прямого доступа к необходимому контроллеру, я предполагаю, что лучше всего использовать обратный вызов ActiveRecord для создания экземпляра адреса, если он еще не существует , Например. что-то вроде

# user.rb
after_initialize :create_address

def create_address
    self.address = Address.new if self.address.nil?
end
...