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更改后您重新启动了服务器吗?这些值保存到数据库了吗?我重新启动了服务器。未保存任何数据,表单仍无法验证,突出显示了账单地址的字段