Rails accepts_nested_attributes_for
Rails accepts_nested_attributes_for
为了好玩,我正在手工制作用户身份验证系统。我创建了两个不同的模型,一个 UserAccount
和 UserCredential
想法是电子邮件、用户名、个人资料照片等凭据与实际帐户分开。
为了在创建 UserAccount
时创建 UserCredential
,我使用 accepts_nested_attributes_for
。当 UserAccount
保存时,我 运行 遇到一些保存 UserCredential
的问题。
迁移:
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
错误。
我想你需要将 user_credentials
更改为 user_credentials_attributes
def user_params
params.require(:user_account).permit(user_credentials_attributes: [:email])
end
当通过表单提交嵌套属性时,_attributes
标记会附加到嵌套属性父级。
为了好玩,我正在手工制作用户身份验证系统。我创建了两个不同的模型,一个 UserAccount
和 UserCredential
想法是电子邮件、用户名、个人资料照片等凭据与实际帐户分开。
为了在创建 UserAccount
时创建 UserCredential
,我使用 accepts_nested_attributes_for
。当 UserAccount
保存时,我 运行 遇到一些保存 UserCredential
的问题。
迁移:
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
错误。
我想你需要将 user_credentials
更改为 user_credentials_attributes
def user_params
params.require(:user_account).permit(user_credentials_attributes: [:email])
end
当通过表单提交嵌套属性时,_attributes
标记会附加到嵌套属性父级。