这是我的第一个问题。我希望你能帮助我。我有两个模特。
class Cliente < ActiveRecord::Base
attr_accessible :cedula, :direccion, :nombres, :telefono
validates :cedula, :direccion, :nombres, :telefono, :presence => true
validates :cedula, :uniqueness => { :message => "Cedula ya en uso" }
has_many :facturas
class Factura < ActiveRecord::Base
attr_accessible :cliente_attributes, :iva, :numero, :subtotal, :total, :created_at
belongs_to :cliente
accepts_nested_attributes_for :cliente
我想在facturas中#new视图可以创建或编辑Cliente。如果存在更新或者如果不存在则创建。我正在使用嵌套属性。如果存在,我使用javascript填充文本字段。如果不存在,我填写文本字段并保存Factura保存。这是facturas#new view。
<h1>Nueva Factura</h1>
<%= form_for @factura do |f| %>
<% if @factura.errors.any? %>
<h2>Errores:</h2>
<ul>
<% @factura.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
<% end %>
<p>
<div class = "contenedor_factura">
<%= f.label :numero %><br />
<%= f.number_field :numero %><br />
<%= f.label :fecha %><br />
<%= f.date_select :created_at %><br />
</div>
<div class = "contenedor_cliente">
<%= f.fields_for @cliente do |builder| %>
<%= builder.label :cedula, "Cédula" %>
<%= builder.text_field :cedula %>
<%= builder.label :nombres, "Nombres" %>
<%= builder.text_field :nombres %>
<%= builder.label :direccion, "Dirección" %><br />
<%= builder.text_field :direccion %>
<%= builder.label :telefono, "Teléfono" %><br />
<%= builder.text_field :telefono %>
<%= builder.hidden_field :id%>
<% end %>
</div>
<div class = "contenedor_productos">
</div>
<%= f.label :subtotal %><br />
<%= f.text_field :subtotal %>
<br />
<%= f.label :iva %><br />
<%= f.text_field :iva %>
</p>
<p>
<%= f.submit "Agregar Nueva Factura" %>
</p>
<% end %>
当Cliente是新的时我没有问题,它会保存,但如果Cliente存在我有这个消息
ActiveRecord::RecordNotFound in FacturasController#create
Couldn't find Cliente with ID=6 for Factura with ID=
我的问题是什么?
编辑:
这是我的FacturasController
def new
@factura = Factura.new
@cliente = @factura.build_cliente
end
def create
@factura = Factura.new(params[:factura])
if @factura.save
redirect_to facturas_path, :notice => "Factura Guardada"
else
render "new"
end
end
答案 0 :(得分:2)
我不确定nested_attrubes是否处理已创建的模型。所以我们可以不依赖它。
这应该有效
def create
cliente_attrs = params[:factura].delete :cliente
@cliente = cliente_attrs[:id].present? ? Cliente.find(cliente_attrs[:id]) : User.create(user_attrs)
@factura = cliente.facturas.build(params[:factura])
if @factura.save
redirect_to facturas_path, :notice => "Factura Guardada"
else
render "new"
end
end
您现在可以删除第accepts_nested_attributes_for :cliente
行