无法在多态关联上保存嵌套模型
Can't save nested model on polymorphic association
被迫寻求有关在多态关联上保存嵌套模型的帮助。我错过了一些东西,但无法弄清楚是什么。
一切都非常简单。 Address 可以有多个 Phones。
所以模型是
class Address < ActiveRecord::Base
has_many :phones, as: :phoneable
accepts_nested_attributes_for :phones, allow_destroy: true
validates :city, :street, :building, :name, presence: true
end
和
class Phone < ActiveRecord::Base
belongs_to :phoneable, polymorphic: true
validates :number, :extension, presence: true
end
addresses_controller.rb
def new
@address = Address.new
@phone = @address.phones.build
authorize @address
end
def create
@address = Address.create(address_params)
authorize @address
if @address.save
binding.pry
flash[:success] = "Address #{@address.name} created"
redirect_to address_path(@address)
else
flash.now[:danger] = 'Failed'
render :new
end
end
def address_params
params.require(:address).permit(:name, :street, :building, :city, phones_attributes: [:id, :number, :extension, :details] )
end
/app/views/address.html.erb
<div class="row">
<div class="col-md-12">
<%= form_for(@address, html: {class: 'form-horizontal', role: 'form'}) do |f| %>
<%= render 'shared/errors', obj: @address, model_name: 'addresses' %>
<div id="create-form">
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :city, 'Город' %>
</div>
<div class="col-md-4">
<%= f.select(:city, options_for_select(['Moscow', 'Samara']), {}, {class: "form-control"}) %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :street, 'Street' %>
</div>
<div class="col-md-4">
<%= f.text_field :street, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :building, 'Building' %>
</div>
<div class="col-md-4">
<%= f.text_field :building, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :name, 'Place name' %>
</div>
<div class="col-md-4">
<%= f.text_field :name, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :phones, 'Phone' %>
</div>
<div class="col-md-4">
<%= f.fields_for :phone do |phone_form| %>
<%= phone_form.text_field :number, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= phone_form.label :extension, 'Ext.' %>
</div>
<div class="col-md-4">
<%= phone_form.text_field :extension, class: 'form-control' %>
</div>
<% end %>
</div>
<div class="form-group">
<div class='col-md-offset-4 col-md-6'>
<%= f.submit @address.new_record? ? 'Add' : 'Update', class: 'btn btn-primary btn-md' %>
</div>
</div>
</div>
<% end %>
</div>
</div>
我遇到的第一个问题是如果我将键 :phones
而不是 :phone
设置到下一行 <%= f.fields_for :phone do |phone_form| %>
我的 phone 文本字段不会在视图中呈现但是他们应该。一位用户在这里强调了这一刻
如果我使用 :phone
一切正常,但似乎是错误的。
第二个。
Phone 对象不保存在数据库中,当我创建新地址或编辑当前地址时,我成功了,但如果我将所有字段留空,phone 不会显示任何验证错误。
这是我在 params
hash
中的内容
{"utf8"=>"✓",
"authenticity_token"=>"inwXr3Ev/Aj/hZRY2IadizDHDgdSFo2zFhY9DAvysfFu3jjD9AS66esKVsTzEuKo2WC46YQt6HnOKTgInvfUEg==",
"address"=>{"city"=>"Moscow", "street"=>"ul. Tsentralnaya d. 4 kv. 220", "building"=>"1212", "name"=>"Astoria", "phone"=>{"number"=>"9215555555", "extension"=>"111"}},
"commit"=>"Add",
"controller"=>"addresses",
"action"=>"create"}
我错过了什么?
尝试回答 2 个问题:
正确的方法是传递:phones
,然后phone
作为变量传递给field_for
,就像完成here:
<%- @address.phones.each.with_index do |phone, index| %>
<%- f.fields_for :phones, phone do |phone_form| %>
<%- end %>
<%- end %>
应该从第一个问题开始解决,因为字段应该通过 params
不是 phone
散列,而是 phones_attributes
数组发送到服务器哈希值,为了 accepts_nested_attributes_for
可以接受电话:
phones_attributes: [{ ... },{ ... }]
被迫寻求有关在多态关联上保存嵌套模型的帮助。我错过了一些东西,但无法弄清楚是什么。 一切都非常简单。 Address 可以有多个 Phones。 所以模型是
class Address < ActiveRecord::Base
has_many :phones, as: :phoneable
accepts_nested_attributes_for :phones, allow_destroy: true
validates :city, :street, :building, :name, presence: true
end
和
class Phone < ActiveRecord::Base
belongs_to :phoneable, polymorphic: true
validates :number, :extension, presence: true
end
addresses_controller.rb
def new
@address = Address.new
@phone = @address.phones.build
authorize @address
end
def create
@address = Address.create(address_params)
authorize @address
if @address.save
binding.pry
flash[:success] = "Address #{@address.name} created"
redirect_to address_path(@address)
else
flash.now[:danger] = 'Failed'
render :new
end
end
def address_params
params.require(:address).permit(:name, :street, :building, :city, phones_attributes: [:id, :number, :extension, :details] )
end
/app/views/address.html.erb
<div class="row">
<div class="col-md-12">
<%= form_for(@address, html: {class: 'form-horizontal', role: 'form'}) do |f| %>
<%= render 'shared/errors', obj: @address, model_name: 'addresses' %>
<div id="create-form">
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :city, 'Город' %>
</div>
<div class="col-md-4">
<%= f.select(:city, options_for_select(['Moscow', 'Samara']), {}, {class: "form-control"}) %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :street, 'Street' %>
</div>
<div class="col-md-4">
<%= f.text_field :street, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :building, 'Building' %>
</div>
<div class="col-md-4">
<%= f.text_field :building, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :name, 'Place name' %>
</div>
<div class="col-md-4">
<%= f.text_field :name, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= f.label :phones, 'Phone' %>
</div>
<div class="col-md-4">
<%= f.fields_for :phone do |phone_form| %>
<%= phone_form.text_field :number, class: 'form-control' %>
</div>
</div>
<div class="form-group">
<div class="control-label col-md-4">
<%= phone_form.label :extension, 'Ext.' %>
</div>
<div class="col-md-4">
<%= phone_form.text_field :extension, class: 'form-control' %>
</div>
<% end %>
</div>
<div class="form-group">
<div class='col-md-offset-4 col-md-6'>
<%= f.submit @address.new_record? ? 'Add' : 'Update', class: 'btn btn-primary btn-md' %>
</div>
</div>
</div>
<% end %>
</div>
</div>
我遇到的第一个问题是如果我将键 :phones
而不是 :phone
设置到下一行 <%= f.fields_for :phone do |phone_form| %>
我的 phone 文本字段不会在视图中呈现但是他们应该。一位用户在这里强调了这一刻
如果我使用 :phone
一切正常,但似乎是错误的。
第二个。
Phone 对象不保存在数据库中,当我创建新地址或编辑当前地址时,我成功了,但如果我将所有字段留空,phone 不会显示任何验证错误。
这是我在 params
hash
{"utf8"=>"✓",
"authenticity_token"=>"inwXr3Ev/Aj/hZRY2IadizDHDgdSFo2zFhY9DAvysfFu3jjD9AS66esKVsTzEuKo2WC46YQt6HnOKTgInvfUEg==",
"address"=>{"city"=>"Moscow", "street"=>"ul. Tsentralnaya d. 4 kv. 220", "building"=>"1212", "name"=>"Astoria", "phone"=>{"number"=>"9215555555", "extension"=>"111"}},
"commit"=>"Add",
"controller"=>"addresses",
"action"=>"create"}
我错过了什么?
尝试回答 2 个问题:
正确的方法是传递
:phones
,然后phone
作为变量传递给field_for
,就像完成here:<%- @address.phones.each.with_index do |phone, index| %> <%- f.fields_for :phones, phone do |phone_form| %> <%- end %> <%- end %>
应该从第一个问题开始解决,因为字段应该通过
params
不是phone
散列,而是phones_attributes
数组发送到服务器哈希值,为了accepts_nested_attributes_for
可以接受电话:phones_attributes: [{ ... },{ ... }]