首页 > 解决方案 > 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 %>

我注意到两件小事:

  1. 如果我更改参数和fields_forto user_credential(删除复数),电子邮件字段就会消失。
  2. 如果我保持参数不变,我会得到这个异常: ActiveModel::UnknownAttributeError (unknown attribute 'user_credentials' for UserAccount.):

我见过有人建议@user.user_credential.build()在新方法中添加一个,但这样做只会给我一个nil:NilClass错误。

标签: ruby-on-railsactiverecord

解决方案


我想你需要更改user_credentialsuser_credentials_attributes

 def user_params
    params.require(:user_account).permit(user_credentials_attributes: [:email])
 end

通过表单提交嵌套属性时,_attributes将为嵌套属性父级附加标记。


推荐阅读