Я работаю над созданием системы аутентификации пользователей для развлечения. Я создал две разные модели, UserAccount
и UserCredential
, идея состоит в том, что учетные данные, такие как адрес электронной почты, имя пользователя, изображение профиля и т. Д., Отделены от фактического аккаунта.
Чтобы создать UserCredential
при создании UserAccount
, я использую accepts_nested_attributes_for
. У меня возникли проблемы с сохранением UserCredential
при сохранении UserAccount
.
Миграция:
create_table :user_accounts, id: :uuid do |t|
t.references :user_credentials
...
end
add_reference :user_credentials, :user_account, type: :uuid, null: false, foreign_key: true
user_account.rb
has_one :user_credential, inverse_of: :user_account, dependent: :destroy
...
accepts_nested_attributes_for :user_credential
validates_associated :user_credential
user_credential.rb
class UserCredential < ApplicationRecord
validates :email, uniqueness: true
belongs_to :user_account, inverse_of: :user_credential
validates_presence_of :user_account
accounts_controller.rb
def new
@user = UserAccount.new
end
def create
@user = UserAccount.create!(user_params)
end
private
def user_params
params.require(:user_account).permit(user_credentials: [:email])
# I'm not sure if `user_credential` should be plural here or not?
end
_form.html.erb
<%= form_with model: @user, local: true do |form| %>
<%= form.fields_for :user_credentials do |u| %>
<div class="form-control">
<%= u.label :email %>
<%= u.email_field :email %>
</div>
<% end %>
...
<% end %>
Я заметил две мелочи:
- если я изменю параметры и
fields_for
наuser_credential
(удалив множественное число), поле электронной почты исчезнет. - Если я оставлю параметры как есть, я получу следующее исключение:
ActiveModel::UnknownAttributeError (unknown attribute 'user_credentials' for UserAccount.):
Я видел, как люди рекомендовали добавить @user.user_credential.build()
к новому методу, но при этом я получаю ошибку nil:NilClass
.
1 ответ
Думаю, вам нужно изменить user_credentials
на user_credentials_attributes
def user_params
params.require(:user_account).permit(user_credentials_attributes: [:email])
end
Когда вложенные атрибуты отправляются через форму, тег _attributes
добавляется для родительского элемента вложенных атрибутов.
Похожие вопросы
Новые вопросы
ruby-on-rails
Ruby on Rails - это полнофункциональная платформа веб-приложений с открытым исходным кодом, написанная на Ruby. Он следует популярной модели фреймворка MVC и известен своим подходом «соглашение поверх конфигурации» при разработке приложений.