gpt4 book ai didi

ruby-on-rails - 为 has_one 关系接受使用 mongoid 的嵌套属性

转载 作者:可可西里 更新时间:2023-11-01 09:56:02 27 4
gpt4 key购买 nike

我对使用 Mongoid 有点陌生,但对 ActiveRecord 有丰富的经验。我有以下型号

def Company
field :name

has_one :owner, autosave: true, class_name: 'User', inverse_of: :company
accepts_nested_attributes_for :owner
end

def User
belongs_to :company, inverse_of: :owner
has_one :profile
end

我的注册 Controller 有以下方法

def new 
@company = Company.new
@company.build_owner
@company.owner.build_profile
respond_with @company
end

在我看来...

= simple_form_for @company, url: user_registration_path do |f| 
= f.error_notification
.inputs
= f.simple_fields_for @company.owner do |o|
= o.input :email, required: true, autofocus: true
= o.simple_fields_for @company.owner.profile do |p|
= p.input :first_name, required: true
= p.input :last_name, required: true
= f.input :name, label: 'Company Name'
= f.input :subdomain
= o.input :password, required: true
= o.input :password_confirmation, required: true
.actions
= f.button :submit, "Sign up"

每当我提交此表单时,返回的参数如下:

{"utf8"=>"✓",
"authenticity_token"=>"6z8+evYUwZwx3iADFewsMHiPl00vT7Eq6WaD8BOnQBc=",
"company"=>
{"user"=>
{"email"=>"testing@testing.com",
"profile"=>{"first_name"=>"testing", "last_name"=>"testing"},
"password"=>"testing",
"password_confirmation"=>"testing"},
"name"=>"testing",
"subdomain"=>"testing"},
"commit"=>"Sign up",
"action"=>"create",
"controller"=>"users/registrations"}

首先,我不明白为什么用户属性有关键字:user,不应该是:user_attributes 或:owner_attributes 吗? mongoid 网站上的示例似乎表明了这一点。其次,当我执行 company = Company.new(params[:company]) 并对该对象执行 company.owner 时,我得到一个 nil 对象。但是,执行 company.user 会返回正确的用户对象。我发现如果在参数中键是 :owner(而不是 :user),关联应该可以正常工作。但默认情况下不会发生这种情况。也许这与简单形式有关?非常感谢任何帮助!

最佳答案

该字段应称为 owner,因为这是模型中字段的名称。

当您调用它时发生的事情 user 是 mongoid 在模型中创建一个动态字段 - company[user]。这是正确的行为,并且在正确使用时是一个非常强大的工具。

我不知道 simple_form 但在标准 rails 中执行此操作的方法是调用 f.fields_for :owner,这应该会为您提供您期望的功能。

关于ruby-on-rails - 为 has_one 关系接受使用 mongoid 的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com