【发布时间】:2016-10-03 13:54:22
【问题描述】:
我的 Rails5 应用程序有一个组织模型和一个用户模型(1:n 关系)。创建组织的工作流程还应包括创建组织的第一个用户。我认为这可以通过嵌套模型使用 ActiveRecord,但是创建操作失败并显示错误消息“用户组织必须存在”。
class Organization < ApplicationRecord
has_many :users, dependent: :destroy
accepts_nested_attributes_for :users
end
class User < ApplicationRecord
belongs_to :organization
end
class OrganizationsController < ApplicationController
def new
@organization = Organization.new
@organization.users.build
end
def create
@organization = Organization.new(organization_params)
if @organization.save
redirect_to @organization
else
render 'new'
end
end
def organization_params
params.require(:organization).permit(:name, users_attributes: [:name, :email, :password, :password_confirmation])
end
end
在视图中我使用<%= f.fields_for :users do |user_form| %> 助手。
这是我这边的错误,还是 ActiveRecord 根本不支持?在导轨指南中找不到任何关于它的信息。毕竟,这应该(理论上)是可能的:首先为组织做 INSERT,然后是用户的 INSERT(顺序很重要,要知道用户外键的组织 id)。
【问题讨论】:
-
您是否记得将“accepts_nested_attributes_for :users”放入您的组织模型文件中?
-
发生这种情况的原因是因为 Rails 5 在默认情况下自然强制执行引用完整性。这意味着组织必须在用户之前存在。
accepts_nested_attributes_for似乎没有实现这个概念。 SO Post to help you around this。其他选择是创建一个新类来保存组织,然后从这个组织中“建立”一个用户(或者在你的控制器中做,虽然我不支持这个) -
试试
belongs_to :organization, optional: true。这将使其具有与 Rails 4 中相同的行为。它不是很好,但它可以防止在用户的存在验证在组织被持久化之前启动的问题。 -
@engineersmnky 谢谢,这帮助我理解了这个问题。我将发布关于我如何解决问题的答案。
标签: ruby-on-rails ruby activerecord