ruby-on-rails - Rails 接受_nested_attributes_for
问题描述
我正在手动滚动用户身份验证系统以获得乐趣。我创建了两个不同的模型,一个UserAccount
想法UserCredential
是电子邮件、用户名、个人资料图片等凭据与实际帐户是分开的。
为了在创建 aUserCredential
时创建一个,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
touser_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
将为嵌套属性父级附加标记。
推荐阅读
- excel - EXCEL 用分隔符将值从右边分开
- xcode - 在 Xcode 中自动禁用在下一个编辑器中打开
- html - 高度比父 div 大 100% - bootstrap
- javascript - 括号内的字母代表什么?
- angular - Angular 10 Jasmine 组件在调用函数后不更新属性
- linux - GIT中的Cherry-pick合并冲突
- java - Minecraft bukkit spigot 插件传送到另一个世界导致崩溃:服务器滴答循环中的异常
- android - 以编程方式为 Kotlin 中 ImageView 的 layout_weight 编写代码
- reactjs - 如何使用 react i18next 库格式化货币
- python - Python:使用函数的输入作为函数内数据框名称的一部分