繁体   English   中英

Rails 4嵌套形式belongs_to关联

[英]rails 4 nested form belongs_to association

我有3个表,其中包括以下模型中所示的嵌套表单关联,并且在尝试保存时不会将其保存在Phone表中。

class Activity < ActiveRecord::Base
    belongs_to :customer
    belongs_to :phone

    accepts_nested_attributes_for :customer 
    accepts_nested_attributes_for :phone, reject_if: proc { |attributes| attributes['N'].blank? }
end

class Customer < ActiveRecord::Base
  has_many   :phones, dependent: :destroy
  has_many   :activities

  accepts_nested_attributes_for :phones, reject_if: proc { |attributes| attributes['phone_number'].blank? }, allow_destroy: true
  accepts_nested_attributes_for :activities
end

class Phone < ActiveRecord::Base
  belongs_to :customer
  has_many   :activities

  accepts_nested_attributes_for :activities
end

和在ActivityController中

def new
    @activity = Activity.new
    @activity.customer = Customer.new
    @activity.phone = Phone.new
end

def activity_params
      params.require(:activity).permit(:activityDate, :customer_id, :phone_id, :details, customer_attributes:  [:id, :name, phone_attributes: [:id, :phone_number]])
end

注意=>我的活动表中有customer_id,phone_id只是为了提高性能

在Activity _form中

 <!-- Nested form customer -->
    <%= f.fields_for :customer do |builder| %>
      <%= render "customer_fields", x: builder %>
    <% end %>

在客户部分

<div class="field form-group">
      <%= x.label "Customer name" %>
      <%= x.text_field :name, class: 'form-control' %>
</div>
<%= x.fields_for :phone do |builder| %>
      <% 3.times do %>
            <%= render "customers/phone_fields", f: builder %>
      <% end %>
<% end %>

在最后一部手机中

<%= f.label :phone_number %>
<%= f.text_field :phone_number %>

为什么我不能在此嵌套中保存电话

按照Zozo的回答,您将需要按以下方式构建关联的对象:

def new
    @activity = Activity.new
    @activity.build_customer.phones.build
end

您还需要考虑一个额外的步骤...您正在将phone字段嵌入到customer字段中。 这意味着您必须建立关联模型,因为它们是关联的:

#app/models/activity.rb
class Activity < ActiveRecord::Base
   belongs_to :phone
   belongs_to :customer
   accepts_nested_attributes_for :customer 
end

#app/models/customer.rb
class Customer < ActiveRecord::Base
   has_many :phones
   accepts_nested_attributes_for :phones
end

当您想要像这样嵌入fields_for 时才fields_for

#app/controllers/activities_controller.rb
class ActivitiesController < ApplicationController
   def new
      @activity = Activity.new
      @activity.build_customer.phones.build
   end
   def create
      @activity = Activity.new activity_params
      @activity.save
   end

   private

   def activity_params
       params.require(:activity).permit(:x, :y, :z, customer_attributes:[ phones_attributes: [:phone, :attributes] ])
   end
end

#app/views/activities/new.html.erb
<%= form_for @activity do |f| %>
   <%= f.fields_for :customer do |x| %>
      <%= x.fields_for :phones do |phones| %> #-> see how you're embedding this inside the original fields_for?
         <%= phones.text_field %>
      <% end %> 
   <% end %>
<% end %>

要正常执行此操作,您只需要将关联数据构建为单独的对象:

#app/models/activity.rb
class Activity < ActiveRecord::Base
   belongs_to :customer
   belongs_to :phone

   accepts_nested_attributes_for :customer, :phone
end

#app/controllers/activities_controller.rb
class ActivitiesController < ApplicationController
   def new
       @activity = Activity.new  
       @activity.build_customer
       @activity.build_phone
   end
end

#app/views/activities/new.html.erb
<%= form_for @activities do |f| %>
   <%= f.fields_for :customer do |customer| %>
      <%= customer.text_field .... %>
   <% end %>
   <%= f.fields_for :phone do |phone| %>
      <%= phone.text_field .... %>
   <% end %>
<% end %>

我几乎忘了,还有别的...

<% 3.times do %>
    <%= render "customers/phone_fields", f: builder %>
<% end %>

非常糟糕的做法。

如果要加载3组fields_for ,则需要构建对象3次,例如:

def new
    @activity = Activity.new
    3.times do
       @activity.build_phone
    end
end

<%= form_for @activity do |f| %>
   <%= f.fields_for :phone do |f| %>
      This will appear 3 times
   <% end %> 
<% end %>

Activity.newCustomer.newPhone.new创建相应类的实例,而不将它们保存到数据库中。 为此,在处理了创建的对象之后,必须调用save方法。 例如@activity.save

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM