所以我有两个模型,报告和收据。每份报告都有很多收据。我使用脚手架来生成我的所有视图和内容,但我改变了一些东西,以便当用户创建新报告或编辑新报告时,他们可以在表单中创建和编辑收据。
我的模型已经设置好了:
class Report < ActiveRecord::Base
has_many :receipts, :dependent => :destroy
accepts_nested_attributes_for :receipts, :allow_destroy => true
attr_protected :id
end
class Receipt < ActiveRecord::Base
belongs_to :report
attr_protected :id
validates_presence_of :vendor, :date, :description, :amount, :acctCode
end
我已将表单设置为创建新收据:
<%= form_for @report do |f| %>
....
<%= f.fields_for :receipts, Receipt.new do |receipt| %>
...
<% end %>
<% end %>
但每次我去保存报告时,都会收到路由错误:
No route matches {:action=>"edit", :controller=>"receipts", :report_id=>#<Receipt id: nil, date: nil, vendor: "", description: "", amount: nil, companyCard: false, lobbyingExpense: false, acctCode: "", created_at: nil, updated_at: nil, report_id: 2>}
我的路线设置为:
resources :reports do
resources :receipts
end
我的收据控制器
# GET /receipts/new
def new
@receipt = Receipt.new
respond_to do |format|
format.html # new.html.erb
end
end
# GET /receipts/1/edit
def edit
@receipt = Receipt.find(params[:id])
end
# POST /receipts
def create
@receipt = Receipt.new(params[:receipt])
respond_to do |format|
if @receipt.save
format.html { redirect_to @receipt.Report, notice: 'Receipt was successfully created.' }
else
format.html { render action: "new" }
end
end
end
我有一段时间没碰过铁轨所以我不确定我做错了什么。但在我的旧应用程序(3.1)中,当我添加图像说,博客帖子时,我甚至没有图像控制器,只能通过ajax删除它们。我在这里收据的控制器的唯一原因是因为我使用脚手架来生成视图等。
编辑 - 我还应该指出,如果我转到新收据视图,我会在表单标记上出错:
<%= form_for(@receipt) do |receipt| %>
undefined method `receipts_path'
答案 0 :(得分:1)
如果您使用accepts_nested_attributes_for
,则无需额外的控制器来管理记录。当然,如果您需要特定页面,例如收据的“显示视图”,则需要该控制器。
要获得accepts_nested_attributes_for
所需:
fields_for :receipts
这样您就可以编辑给定报告的所有已创建收据。如果您还想创建新收据,可以添加一个空白收据:@report.receipts.build
。您可以将此次调用添加到new
和edit
操作中。
请注意,您可以在报表的表单中编辑收据。这意味着,您应该点击ReportsController
而不是ReceiptsController
。
如果事情不起作用,这里有一些调试建议:
form_for(@report)
生成的HTML。特别是表单标记的'action =“”'属性是相关的。它应该指向“/ reports / X”编辑:我创建了一个包含所有相关文件的Gist,以使嵌套表单正常工作:https://gist.github.com/4420280
答案 1 :(得分:0)
为嵌套资源表单执行checkout cocoon gem。这个gem使得处理嵌套资源变得更容易。 https://github.com/nathanvda/cocoon