为什么我的新操作和使用has_many通过不能使用accepts_nested_attributes_for创建操作?

时间:2014-01-18 15:54:51

标签: ruby-on-rails-3 has-many-through has-many

我正在使用与has_many相关联的3个模型构建轨道3.2.16应用程序,但我的保存操作无效。这是我的模特:

class Cliente < ActiveRecord::Base
 has_many :prestamos
  accepts_nested_attributes_for :prestamos, reject_if: :all_blank
end

class User < ActiveRecord::Base
  has_many :prestamos
  has_many :clientes, :through => :prestamos
end

class Prestamo < ActiveRecord::Base
  validates_numericality_of :monto, only_integer: true
  validates :monto, presence: true
  belongs_to :user
  belongs_to :cliente, inverse_of: :prestamos
end

当我尝试使用此

在clientes_controller #new中构建我的@cliente时
@cliente = current_user.clientes.build

和#create

中的这个
@cliente = current_user.clientes.build(params[:cliente])

并使用此视图

<%= simple_form_for(@cliente) do |f| %>
  <%= f.input :nombre %>
  <%= f.input :cedula %>
  <%= f.input :direccion %>
  <%= f.simple_fields_for :prestamos do |builder| %>
    <%= builder.input :monto %>
  <% end %>
  <%= f.button :submit %>
<% end %>

渲染HTML是预期的HTML,但在保存时,我在prestamo模型中获得了与monto相关的验证错误。顺便说一句,monto字段显示两次。

我有的错误:

Prestamos monto不是一个数字 Prestamos monto不能空白

我真的希望有人可以帮助我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

好吧,我可以解决它,但我不确定这是否是最好的方法,因为我在Rails中很新(3个月)。这就是我所做的:

首先,我将我的连接模型Prestamo更改为:

class Prestamo < ActiveRecord::Base
  attr_accessible :monto, :user_id, :cliente_id

  validates_numericality_of :monto, only_integer: true
  validates :monto, presence: true

  belongs_to :user
  belongs_to :cliente, inverse_of: :prestamos

end

验证已经存在,我刚刚将:user_id添加到attr_accessible

第二,我改变了我的新动作并创建了动作:

新:

def new
  @cliente = Cliente.new
  @cliente.prestamos.build(user_id: current_user.id)
end

创建:

@cliente = Cliente.new(params[:cliente])

最后,我在表单中添加了一个隐藏字段,只是为了存储user_id

<%= form.simple_fields_for :prestamos do |f| %>
<%= f.input :monto %>
<%= f.input :user_id, as: :hidden %>
<% end %>