我有一张invoices
的表格,而这张表格可以有很多items
。
现在,在我的invoices
索引视图中,我想在每个invoice
旁边放置一个链接,说明重复发票。
如果没有子记录,这将非常简单:
<%= link_to "Duplicate", new_invoice_path(invoice.attributes) %>
但如果发票的items
也应该重复,怎么办呢?
作为一个Rails新手,我无法理解这一点。可以通过我的控制器内的new
操作处理所有这些吗?
def new
@invoice = current_user.invoices.build(:project_id => params[:project_id])
@title = "New invoice"
end
或者我是否需要创建另一个名为eg的函数我的控制器内有copy
?
最佳做法是什么?
感谢您的任何意见......
答案 0 :(得分:6)
逻辑应该放在模型中
invoice.rb
中的:
def deep_dup
new_invoice = Invoice.create(self.dup.attributes)
items.each do |item|
new_invoice.items.create(item.dup.attributes)
end
return new_invoice
end
然后在控制器中,执行一个名为duplicate
的操作:
def duplicate
new_invoice = @invoice.deep_dup
redirect to new_invoice
end
答案 1 :(得分:0)
在你的创作中也许是这样的事情:
def create
@invoice = Invoice.new(params[:invoice]
#find duplicate invoice (if exists)
duplicate_invoice = Invoice.find(params[:duplicate_invoice_id])
unless duplicate_invoice.nil?
items = nil
duplicate_items = duplicate_invoice.items
duplicate_items.each do |child|
item = Item.new(child.attributes)
item.save
items << item
end
end
if @invoice.save
@invoice.items << items #add the duplicate items to the duplicate invoice
#handle your redirects....
end
end
基本上,您可以将重复发票的ID传递给您的创建操作,找到您打算复制的发票,然后将其子项目处理为一系列重复项目。最后一步是将新复制的项目添加到新复制的发票中。这显然是未经测试的,并且需要一些额外的工作,但我希望你能得到这个想法的要点。可能还有其他方法可以实现这一目标。
当然,也有宝石可以为你做这件事,但这是你的召唤。