Рельсы глубокая вложенная / не вложенная форма - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь создать форму, обрабатывающую 4 модели одновременно с 2 вложенными парами ... Ошибка: у вас есть нулевой объект, когда вы его не ожидали!Возможно, вы ожидали экземпляр Array.Ошибка произошла при оценке ноль.

Есть ли кто-нибудь, кто поможет мне с этим?Для вашей информации я использую рельсы 3.0.и мне нужно работать с 4 моделями в одном и том же виде ... Большое спасибо за вашу помощь, потому что эта сводит меня с ума на несколько дней:)

Вот код контроллера:

def new
@pinvoice = Pinvoice.new
@journal = Journal.new
@compte = Compte.find(:all)
if Journal.last.nil?
then
@internal = 'Pinv1'
else
@internal = 'Pinv' + (Journal.last.id + 1).to_s
end
1.times {@pinvoice.pinvlines.build}
4.times {@journal.lignes.build}
respond_to do |format|
format.html # new.html.erb
format.xml  { render :xml => @pinvoice }
end
end

Код модели:

class Pinvoice < ActiveRecord::Base
has_many :pinvlines, :dependent => :destroy
accepts_nested_attributes_for :pinvlines
end

class Pinvline < ActiveRecord::Base
belongs_to :pinvoice
belongs_to :compte
belongs_to :pinvoice
end

class Ligne < ActiveRecord::Base
belongs_to :journal
belongs_to :compte
attr_accessor :should_destroy
def should_destroy?
should_destroy.to_i == 1
end
end

class Journal < ActiveRecord::Base
has_many :lignes, :dependent => :destroy
accepts_nested_attributes_for :lignes, :reject_if => lambda { |a| a[:montant].to_s == "0"}
attr_accessor :taux
attr_accessor :compte_tva
validates_presence_of :date
validates_presence_of :texte
validates_presence_of :montant_HTVA
validates_presence_of :banque
validates_presence_of :compte
before_update :delete_lignes
def delete_lignes
@lignes.each do |l|
if l.new_record?
l.save
else
l.destroy
end
end
end
end

и большая форма:

<%= javascript_include_tag 'javascript_pinvlines_fields_new' %>
<%= form_for @pinvoice do |f| %>
<% if @pinvoice.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@pinvoice.errors.count, "error") %> prohibited this pinvoice from being saved:</h2>
<ul>
<% @pinvoice.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :internal %>
<%= f.text_field :internal, :value => @internal %><br />
<%= f.label :contact %>
<%= f.text_field :contact, :id => 'test' %>
<%= f.label :date_facture %>
<%= f.date_select :date_facture %>
<%= f.label :montant_total %>
<%= f.text_field :montant_total %>
</p>
<h2>Details</h2>
<%= f.fields_for :pinvlines do |builder| %>
<%= render "pinvline_fields", :f => builder %>
<%end%>
<p><%= link_to_add_fields "Ajouter une ligne", f, :pinvlines%></p>
<h2>Jounal</h2>
<%= fields_for @journal do |j| %>
<%= j.label :date %><br />
<%= j.text_field :date, :size => 10 %> <i> au format YYYY-MM-DD </i><br />
<%= j.label :texte %><br />
<%= j.text_field :texte%><br />
<%= j.label :banque %><br />
<%= j.text_field :banque %><br />
<%= j.label :montant_hors_tva %><br />
<%= j.text_field :montant_HTVA%><br />
<%= j.label :tva_id %><br />
<%= j.text_field :tva_id %><br />
<%= j.label :taux %><br />
<%= j.text_field :taux %><br />
<%= j.label :compte_tva %><br />
<%= j.text_field :compte_tva %><br />
<%= j.label :montant_TVA %><br />
<%= j.text_field :montant_TVA%><br />
<%= j.label :montant %><br />
<%= j.text_field :montant %><br />
<%= j.label :compte %><br />
<%= j.text_field :compte %><br />
<%= j.label :internal %><br />
<%= j.text_field :internal, :value => @internal%><br />
<%= j.label :source %><br />
<%= j.text_field :source%>
<br />
<h2>Lignes</h2>
<div class='container'>
<div class="duplicate">
<%= j.fields_for :lignes do |j| %>
<%= j.label :date %>
<%= j.text_field :date, :size=> 8 %>
<%= j.label :compte_id %>
<%= j.text_field :compte_id, :size=> 8  %>
<%= j.label :montant %>
<%= j.text_field :montant, :size=> 8  %>
<%= j.label :debit %>
<%= j.text_field :debit, :size=> 8  %>
<%= j.label :credit %>
<%= j.text_field :credit, :size=> 8  %> 
<br />  
<% end %>
</div>
</div>
<%end%>
<p><%= f.submit %></p>
<% end %>

1 Ответ

0 голосов
/ 15 марта 2012

В конце я нашел способ справиться с этим с помощью обратного вызова на уровне модели.

...