2012-12-29 78 views
0

所以我有兩個模型,報告和收據。每份報告都有許多收據。我使用腳手架來生成我所有的視圖和內容,但我正在改變事物,以便在用戶創建新報表或編輯新報表時,他們可以在表單中創建和編輯收據。如何在rails 3.2中創建和編輯嵌套對象?

我的模型建立:

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刪除它們。我在這裏有收款人的唯一理由是因爲我使用腳手架來產生觀點等。

編輯 - 我還要指出,如果我去新收到的看法,我得到的表單標籤的錯誤:如果您正在使用accepts_nested_attributes_for你不需要額外的

<%= form_for(@receipt) do |receipt| %> 

undefined method `receipts_path' 
+1

提供創建/更新操作的代碼。在我看來問題不在於形式。然而你的f.fields_for很奇怪。 –

+0

我會使用'@ report.receipts.build'而不是'Receipt.new'。不要以爲這會解決你的問題。 – Azolo

+0

添加我的收據控制器。還有 - @ report.receipts.build實際上給了我相同的路由錯誤... – rugbert

回答

1

控制器來管理記錄。當然,如果您需要特定的頁面,例如收據的「顯示視圖」,則需要該控制器。

要獲得accepts_nested_attributes_for您需要:

  1. 一個形式報告
  2. 使用fields_for :receipts在形式

這樣,您就可以編輯創建的所有收據給定的報告。如果您還想創建新收據,您可以添加空白收據:@report.receipts.build。您可以將此呼叫添加到您的newedit操作中。

請注意,您在報表的窗體中編輯收據。這意味着,您應該點擊ReportsController而不是ReceiptsController

如果事情沒有在這裏工作是一些調試建議:

  • 執行耙路線,看看是否一切都正確定義。
  • 檢查從form_for(@report)生成的HTML。特別是表單標籤的'action ='「'屬性是相關的。它應該指向「/報告/ X」

編輯:我創建了所有相關的文件,其主旨在於獲得一個嵌套表格的工作:https://gist.github.com/4420280

+0

非常感謝! 50獎勵你!快速的問題,我將如何在每張收據的表格中加入刪除鏈接?我嘗試使用'resources:receipts,:only => [:destroy,:edit,:show]'和link_to'<%#= link_to'Delete'來添加嵌套資源,receipt_path(@report,receipt.object。 ID),:方法=>:刪除%>'但我得到一個未定義的方法錯誤'receipt_path' – rugbert

相關問題