Ruby on rails 4 具有双重关联的Rails 4嵌套表单

Ruby on rails 4 具有双重关联的Rails 4嵌套表单,ruby-on-rails-4,nested-attributes,strong-parameters,Ruby On Rails 4,Nested Attributes,Strong Parameters,我有这样一个订单模型: class Order < ActiveRecord::Base belongs_to :service_address, class_name: 'Address' belongs_to :billing_address, class_name: 'Address' accepts_nested_attributes_for :service_address, allow_destroy: true accepts_nested_attribut

我有这样一个订单模型:

class Order < ActiveRecord::Base
  belongs_to :service_address, class_name: 'Address'
  belongs_to :billing_address, class_name: 'Address'

  accepts_nested_attributes_for :service_address, allow_destroy: true
  accepts_nested_attributes_for :billing_address, allow_destroy: true
end

class Address < ActiveRecord::Base

end
params.require(:order).permit(:contract_id, :billing_address_id, :service_address_id, :valid_from, :valid_to, :contact_person_id, :billing_mode,
                                service_address: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy],
                                billing_address: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy])
@order = Order.new(order_params)
@order.service_address = Address.new(params[:order][:service_address])
@order.billing_address = Address.new(params[:order][:billing_address])
我的创建操作如下所示:

class Order < ActiveRecord::Base
  belongs_to :service_address, class_name: 'Address'
  belongs_to :billing_address, class_name: 'Address'

  accepts_nested_attributes_for :service_address, allow_destroy: true
  accepts_nested_attributes_for :billing_address, allow_destroy: true
end

class Address < ActiveRecord::Base

end
params.require(:order).permit(:contract_id, :billing_address_id, :service_address_id, :valid_from, :valid_to, :contact_person_id, :billing_mode,
                                service_address: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy],
                                billing_address: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy])
@order = Order.new(order_params)
@order.service_address = Address.new(params[:order][:service_address])
@order.billing_address = Address.new(params[:order][:billing_address])
以这种方式提交时,表单不会验证,账单地址的所有字段都会突出显示为不完整

如果我使用
service\u address\u params
billing\u address\u params
我会得到一个
未定义的局部变量或方法“service\u address\u params”的错误。

我在这里被困了两天,所以任何帮助都将不胜感激

编辑:
new

def new
  @order = Order.new
  @order.service_address = Address.new
  @order.billing_address = Address.new
end
编辑:
表单

<%= simple_form_for @order, data: {validate: 'parsley'} do |f| %>
  <%= f.input :contract_id, as: :hidden, :input_html => { :value => @contract_id } %>
  <%= f.input :same_billing_address, as: :hidden, :input_html => { :value => 0 } %>

  <%= f.error_notification %>

  <%= render :partial => 'order_data', :locals => { f: f } %>
  <%= render :partial => 'service_address' %>
  <%= render :partial => 'billing_address' %>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>
<%= f.simple_fields_for :service_address do |sa| %>
  <%= render :partial => 'service_address',:locals => { f: sa }%>
<% end %>

<%= f.simple_fields_for :billing_address do |ba| %>
  <%= render :partial => 'billing_address',:locals => { f: ba } %>
<% end %>

首先,使用
接受
的的的嵌套的属于是一种痛苦,而且相当棘手。其次,代码中有很多错误。我将逐一解释

错误#1

您的
新方法应该是这样的

def new
  @order = Order.new
  @order.build_service_address 
  @order.build_billing_address
end
def order_params
 params.require(:order).permit(:contract_id, :billing_address_id, :service_address_id,    :valid_from, :valid_to, :contact_person_id, :billing_mode,service_address_attributes: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy],billing_address_attributes: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy])
end
<%= render :partial => 'service_address',:locals => { f: sa }%>
<%= render :partial => 'billing_address',:locals => { f: ba } %>
#_service_address.html.erb
<div class="form-inputs" id="inputs-step2">
    <%= f.input :city_id, label: 'Oras', collection: @cities, input_html: { 'data-parsley-group' => "block2", :required => true, id: 'service_address_city_id' } %>
    <%= f.input :street_id, label: 'Strada', collection: @streets, input_html: { 'data-parsley-group' => "block2", :required => true, id: 'service_address_street_id' } %>
    <%= f.input :number, label: 'Numar', input_html: { 'data-parsley-group' => "block2", :required => true } %>
    <%= f.input :block, label: 'Bloc' %>
    <%= f.input :entrance, label: 'Scara' %>
    <%= f.input :floor, label: 'Etaj' %>
    <%= f.input :apartment, label: 'Apartament' %>
  </div>

#_billing_address.html.erb
<div class="form-inputs" id="inputs-step3">
    <%= f.input :city_id, label: 'Oras', collection: @cities, input_html: { 'data-parsley-group' => "block3", :required => true, id: 'billing_address_city_id' } %>
    <%= f.input :street_id, label: 'Strada', collection: @streets, input_html: { 'data-parsley-group' => "block3", :required => true, id: 'billing_address_street_id' } %>
    <%= f.input :number, label: 'Numar', input_html: { 'data-parsley-group' => "block3", :required => true } %>
    <%= f.input :block, label: 'Bloc' %>
    <%= f.input :entrance, label: 'Scara' %>
    <%= f.input :floor, label: 'Etaj' %>
    <%= f.input :apartment, label: 'Apartament' %>
  </div>
create
方法中,不需要这些行,请删除它们

@order.service_address = Address.new(params[:order][:service_address])
@order.billing_address = Address.new(params[:order][:billing_address])
错误#2

您的
order\u params
方法应该如下

def new
  @order = Order.new
  @order.build_service_address 
  @order.build_billing_address
end
def order_params
 params.require(:order).permit(:contract_id, :billing_address_id, :service_address_id,    :valid_from, :valid_to, :contact_person_id, :billing_mode,service_address_attributes: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy],billing_address_attributes: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy])
end
<%= render :partial => 'service_address',:locals => { f: sa }%>
<%= render :partial => 'billing_address',:locals => { f: ba } %>
#_service_address.html.erb
<div class="form-inputs" id="inputs-step2">
    <%= f.input :city_id, label: 'Oras', collection: @cities, input_html: { 'data-parsley-group' => "block2", :required => true, id: 'service_address_city_id' } %>
    <%= f.input :street_id, label: 'Strada', collection: @streets, input_html: { 'data-parsley-group' => "block2", :required => true, id: 'service_address_street_id' } %>
    <%= f.input :number, label: 'Numar', input_html: { 'data-parsley-group' => "block2", :required => true } %>
    <%= f.input :block, label: 'Bloc' %>
    <%= f.input :entrance, label: 'Scara' %>
    <%= f.input :floor, label: 'Etaj' %>
    <%= f.input :apartment, label: 'Apartament' %>
  </div>

#_billing_address.html.erb
<div class="form-inputs" id="inputs-step3">
    <%= f.input :city_id, label: 'Oras', collection: @cities, input_html: { 'data-parsley-group' => "block3", :required => true, id: 'billing_address_city_id' } %>
    <%= f.input :street_id, label: 'Strada', collection: @streets, input_html: { 'data-parsley-group' => "block3", :required => true, id: 'billing_address_street_id' } %>
    <%= f.input :number, label: 'Numar', input_html: { 'data-parsley-group' => "block3", :required => true } %>
    <%= f.input :block, label: 'Bloc' %>
    <%= f.input :entrance, label: 'Scara' %>
    <%= f.input :floor, label: 'Etaj' %>
    <%= f.input :apartment, label: 'Apartament' %>
  </div>
请注意更改
服务地址属性
账单地址属性

错误#3

您没有将
本地人
传递到您的
服务地址
账单地址
部分

这些线

<%= render :partial => 'service_address' %>
<%= render :partial => 'billing_address' %>
然后像这样更改
服务地址
账单地址
部分
中的代码

def new
  @order = Order.new
  @order.build_service_address 
  @order.build_billing_address
end
def order_params
 params.require(:order).permit(:contract_id, :billing_address_id, :service_address_id,    :valid_from, :valid_to, :contact_person_id, :billing_mode,service_address_attributes: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy],billing_address_attributes: [:city_id, :street_id, :number, :block, :entrance, :floor, :apartment, :_destroy])
end
<%= render :partial => 'service_address',:locals => { f: sa }%>
<%= render :partial => 'billing_address',:locals => { f: ba } %>
#_service_address.html.erb
<div class="form-inputs" id="inputs-step2">
    <%= f.input :city_id, label: 'Oras', collection: @cities, input_html: { 'data-parsley-group' => "block2", :required => true, id: 'service_address_city_id' } %>
    <%= f.input :street_id, label: 'Strada', collection: @streets, input_html: { 'data-parsley-group' => "block2", :required => true, id: 'service_address_street_id' } %>
    <%= f.input :number, label: 'Numar', input_html: { 'data-parsley-group' => "block2", :required => true } %>
    <%= f.input :block, label: 'Bloc' %>
    <%= f.input :entrance, label: 'Scara' %>
    <%= f.input :floor, label: 'Etaj' %>
    <%= f.input :apartment, label: 'Apartament' %>
  </div>

#_billing_address.html.erb
<div class="form-inputs" id="inputs-step3">
    <%= f.input :city_id, label: 'Oras', collection: @cities, input_html: { 'data-parsley-group' => "block3", :required => true, id: 'billing_address_city_id' } %>
    <%= f.input :street_id, label: 'Strada', collection: @streets, input_html: { 'data-parsley-group' => "block3", :required => true, id: 'billing_address_street_id' } %>
    <%= f.input :number, label: 'Numar', input_html: { 'data-parsley-group' => "block3", :required => true } %>
    <%= f.input :block, label: 'Bloc' %>
    <%= f.input :entrance, label: 'Scara' %>
    <%= f.input :floor, label: 'Etaj' %>
    <%= f.input :apartment, label: 'Apartament' %>
  </div>
##_service_address.html.erb
“block2”,:required=>true,id:'service\u address\u city\u id'}%>
“block2”,:required=>true,id:'service\u address\u street\u id'}%>
“block2”,:必选=>true}%>
#_账单地址:http://www.html.erb
“block3”,:required=>true,id:'账单\地址\城市\ id'}%>
“block3”,:required=>true,id:'账单\地址\街道\ id'}%>
“block3”,:必选=>true}%>

您可以发布控制器的
新方法吗?还有
表单代码
地址模型中没有验证。我把它们遗漏了。只针对城市id和街道。请将您的
账单地址也部分发布。谢谢您的建议。我做了更改,但是
账单地址
字段仍然会高亮显示。我编辑了这个问题并发布了参数散列:如果将
nestead\u属性
allows\u to
一起使用是一种痛苦,那么最好的方法是什么?使用
有许多
地址并添加一个
地址类型
属性?@hmail请使用
参数哈希更新您的问题
,不要尝试在我的答案中发布它:)@hmail更改后您重新启动了服务器吗?这些值保存到数据库了吗?我重新启动了服务器。未保存任何数据,表单仍无法验证,突出显示了
账单地址的字段