gpt4 book ai didi

ruby-on-rails - Ruby:使用嵌套表单时如何在 Controller 中赋值?

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:22 25 4
gpt4 key购买 nike

我有 3 个模型:雇主、合作伙伴和协作。

作为雇主,我想向我的合作伙伴模型和协作模型添加一条记录,以便能够指示合作伙伴和雇主之间的协作。因此,我的数据库/标签中有以下列。

模型

class Employer < ActiveRecord::Base
has_many :collaborations
has_many :partners, :through => :collaborations
end

class Partner < ActiveRecord::Base
has_many :collaborations
has_many :employers, :through => :collaborations
accepts_nested_attributes_for :collaborations
end

class Collaboration < ActiveRecord::Base
belongs_to :employer
belongs_to :partner
end

表格

Collaborations
employer_id:integer
partner_id:integer
tarive:string

Partners
added_by:integer
name:string

因为我希望能够在 1 个表单中添加合作伙伴/协作,所以我使用了嵌套表单。所以我可以一次添加合作伙伴(姓名等)和协作(tarive 等)。

我的 (simple_form) 表单看起来像这样(我有 named_space 资源)。为了减少困惑,我尽可能多地删除了 HTML 标记,这不是问题所在。

表格

/views/employer/partners/_form

= simple_form_for [:employer, @partner], html: { multipart: true } do |f| 
Partner
= f.input :name, input_html: { class: 'form-control' }

= f.simple_fields_for :collaborations do |ff|
Tarive
= ff.input :tarive, input_html: { class: 'form-control' }

= f.button :submit, "Save"

我的 Controller 看起来像

class Employer::PartnersController < ActionController::Base
def new
@partner = Partner.new
@partner.collaborations.build
end

def create
@partner = Partner.new(partner_params)
@partner.collaborations.build
@partner.added_by = current_employer.id
@partner.collaborations.employer_id = current_employer.employer_id
@partner.collaborations.partner_id = @partner.id
@partner.collaborations.added_by = current_employer.id

if @partner.save
redirect_to employer_partner_path(@partner), notice: "Succes!"
else
render 'new'
end
end

def partner_params
params.require(:partner).permit(:id, :name, collaborations_attributes: [:id, :employer_id, :partner_id, :tarive])
end
end

问题

我的问题/问题是这样的。属性被很好地分配并添加到模型中。但我也想添加一个 employer_id,我在 current_employer.employer.id (Devise) 中有它。我不想使用隐藏表单,只是为了避免这个问题。

我总是像 @partner.added_by = current_employer.id 那样分配“父”模型,效果很好。

当我使用时:

@partner.collaborations.employer_id = current_employer.employer_id

我得到一个错误,说 @partner.collaborations.employer_id 是空的。

问题

如何在我的 controller#create 中将变量分配给 nested_form(协作)?或者更具体地说:如何将 current_employer.employer_id 分配给 @partner.collaborations.employer_id

最佳答案

有几种方式:

  1. Merge the params
  2. Deal with objects, not foreign keys

就我个人而言,我觉得您的create 方法看起来效率很低。实际上,您应该了解胖模型瘦 Controller - 大部分 关联逻辑都应该保留在模型中。

可以通过以下方式改进:

#app/controllers/employers/partners_controller.rb
class Employers::PartnersController < ApplicationController

def new
@partner = current_employer.partners.new #-> this *should* build the associated collaborations object
end

def create
@partner = current_employer.partners.new partner_params
@partner.save ? redirect_to(employer_partner_path(@partner), notice: "Succes!") : render('new')
end

private

def partner_params
params.require(:partner).permit(:id, :name, collaborations_attributes: [:tarive]) #when dealing with objects, foreign keys are set automatically
end
end

这将允许您使用:

#app/views/employers/partners/new.html.erb
= simple_form_for @partner do |f| #-> @partner is built off the current_employer object
= f.input :name
= f.simple_fields_for :collaborations do |ff|
= ff.input :tarive
= f.submit

...和模型:

#app/models/partner.rb
class Partner < ActiveRecord::Base
belongs_to :employer, foreign_key: :added_by

has_many :collaborations
has_many :employers, through: :collaborations

accepts_nested_attributes_for :collaborations
end

#app/models/collaboration.rb
class Collaboration < ActiveRecord::Base
belongs_to :employer
belongs_to :partner

belongs_to :creator, foreign_key: :added_by

before_create :set_creator

private

def set_creator
self.creator = self.employer_id #-> will probably need to change
end
end

#app/models/employer.rb
class Employer < ActiveRecord::Base
has_many :collaborations
has_many :employers, through: :collaborations
end

这可能不会让您能够设置tarive,但是如果您减少模型中的手动声明,我们应该能够考虑对其进行排序.

您需要做的主要事情是精简 Controller 中的代码。您非常具体,因此遇到了您提到的问题。

关于ruby-on-rails - Ruby:使用嵌套表单时如何在 Controller 中赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33231271/

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