Rails3更新操作问题嵌套资源

时间:2011-08-04 22:46:28

标签: ruby-on-rails ruby-on-rails-3

我对嵌套资源的更新操作有问题。

在我的应用中,我的订单有很多发票。

创建新发票,我正确地得到以下网址:

/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

2 个答案:

答案 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