我对嵌套资源的更新操作有问题。
在我的应用中,我的订单有很多发票。
创建新发票,我正确地得到以下网址:
/orders/11/invoices/new
当我再次编辑发票时,这一切都是正确的:
/orders/11/invoices/3/edit
当保存成功时,此方法正常,但如果验证失败,则路由回:
/发票/ 3
我的发票控制器中有以下内容:
def update
# @order = Order.find(params[:order_id])
# @invoice = @order.invoices.find(params[:id])
@invoice = Invoice.find(params[:id])
respond_to do |format|
if @invoice.update_attributes(params[:invoice])
format.html { redirect_to(order_invoice_path(@invoice.order, @invoice), :notice => 'Invoice was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @invoice.errors, :status => :unprocessable_entity }
end
end
end
def edit
@invoice = Invoice.find(params[:id])
3.times { @invoice.invoice_items.build }
end
我假设我需要编辑@ invoice.errors部分,但我不知道要将其更改为什么?
任何帮助表示赞赏。 JX
答案 0 :(得分:1)
在您的表单中,您应该添加订单,如下所示:
<%= form_for [@order, @invoice] ... do |f| %>
...
<% end %>
然后取消注释这两行
# @order = Order.find(params[:order_id])
# @invoice = @order.invoices.find(params[:id])
因此,您的表单会将其请求发送至POST /orders/XX/invoices/XX
答案 1 :(得分:1)
更新失败时,使用“渲染”(与后续路径中的“redirect_to”进行比较),默认情况下会显示发票编辑路径。您可以在此处使用“redirect_to”来保留所需的URI路径,但需要记住保留模型的状态,以便用户无需再次填写整个表单。
详细说明可在此处找到:How to make a render :edit call show the /edit in the address bar
严