有关嵌套属性表单的问题

时间:2013-01-05 17:08:43

标签: ruby-on-rails ruby activerecord nested-attributes nested-form-for

这是我的第一个问题。我希望你能帮助我。我有两个模特。

    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

1 个答案:

答案 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