2012-02-10 8 views
0

こんにちは私はそれが愚かだが、私は任意のエントリを編集するときにこれを持っている知っている。更新アクションが挿入クエリを起動しますか?

私は経費モデルとexpense_line_itemとpaid_line_itemモデルを持っていますが、新しいエントリを作成すると正しく作成されますが、前のエントリを編集すると、更新する代わりに新しいエントリが追加されます。 e。更新アクションでは、挿入クエリが実行されます。ここに私のコードは次のとおりです。

マイコントローラ:

def new 
     @menu = 'Expenses' 
     @page_name = 'Record New Expenses' 
    @expense = Expense.new 
     @expense.expense_line_items.build 
     @expense.paid_line_items.build 
     @expense.voucher_number = "EXP"+Time.now.to_i.to_s 
     @from_accounts = TransactionType.fetch_from_accounts(current_company.id, 'payments') 
     @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'payments') 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @expense } 
    end 
    end 

    # GET /expenses/1/edit 
    def edit 
    @menu = 'Expenses' 
    @page_name = 'Edit Expenses Entry' 
    @expense = Expense.find(params[:id]) 
     @from_accounts = TransactionType.fetch_from_accounts(current_company.id, 'payments') 
     @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'payments') 
    end 

    # POST /expenses 
    # POST /expenses.xml 
    def create 
    @expense = Expense.new(params[:expense]) 
     @expense.created_by = current_user.id 
     @expense.company_id = current_company.id 

    respond_to do |format| 
     if @expense.save 
     format.html { redirect_to(@expense, :notice => 'Expense was successfully created.') } 
     format.xml { render :xml => @expense, :status => :created, :location => @expense } 
     else 
     @menu = 'Expenses' 
     @page_name = 'Record New Expenses' 
       @from_accounts = TransactionType.fetch_from_accounts(current_company.id, 'payments') 
       @to_accounts = TransactionType.fetch_to_accounts(current_company.id, 'payments')     
     format.html { render :action => "new" } 
     format.xml { render :xml => @expense.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /expenses/1 
    # PUT /expenses/1.xml 
    def update 
    @expense = Expense.find(params[:id]) 

    respond_to do |format| 
     if @expense.update_attributes(params[:expense]) 
     format.html { redirect_to(@expense, :notice => 'Expense was successfully updated.') } 
     format.xml { head :ok } 
     else 
     @menu = 'Expenses' 
     @page_name = 'Edit Expenses Entry' 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @expense.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 

マイモデル:

expense model: 


class Expense < ActiveRecord::Base 
     has_many :expense_line_items 
     has_many :paid_line_items 

     accepts_nested_attributes_for :expense_line_items, :reject_if => lambda {|a| a[:account_id].blank? } , :allow_destroy => true 
     accepts_nested_attributes_for :paid_line_items, :reject_if => lambda {|a| a[:account_id].blank? }, :allow_destroy => true 

     #validations 
     validates_presence_of :expense_date, :voucher_number 
     validates_presence_of :expense_line_items 
     validates_associated :expense_line_items 
     validates_presence_of :paid_line_items 
     validates_associated :paid_line_items 


    end 

expense_line_item:

class ExpenseLineItem < ActiveRecord::Base 
    belongs_to :expense 
end 

がpaid_line_item:

class PaidLineItem < ActiveRecord::Base 
    belongs_to :expense 
end 

マイ形式:

<%= form_for(@expense) do |f| %> 

<% @expense.expense_line_items.each_with_index do |expense_line_item, index| %> 
         <%= render "expense_line_items", :expense_line_item => expense_line_item, :index => index %> 
        <% end %> 
        <tr id="row_link" valign="top"> 
         <td valign="top" colspan="6"> 
          <%= link_to "Add new row",{:action => :add_row, :index => @expense.expense_line_items.size}, :remote => true %> 
         </td> 
        </tr> 
<% @expense.paid_line_items.each_with_index do |paid_line_item, index| %> 
        <%= render "paid_line_items", :paid_line_item => paid_line_item, :index => index %> 
        <% end %> 
        <tr id="to_row_link" valign="top"> 
        <td valign="top" colspan="6"> 
         <%= link_to "Add new row",{:action => :add_to_row, :index => @expense.paid_line_items.size}, :remote => true %> 
        </td> 
        </tr> 
<% end %> 

私は、事前に感謝を挫折しました。

+0

私は上記のコードで明らかに間違ったことは何も表示されません。コントローラは大丈夫ですので、問題はおそらく更新のために渡されている@paramsにあります。私たちは、他の意見を見ることなく、それらのパラームがどんなものになるのかを本当に知ることはできません。あなたはそれらを投稿できますか? (expense_line_itemおよびpaid_line_itemビュー) – u2622

+0

更新機能の先頭に「raise params.inspect」を追加して、ここに出力を貼り付けることができますか? – Rahul

+0

ありがとう@rahulこれは、私がラインアイテムに追加するのを忘れたコードのせいでエラーが見つかりました。私はラインアイテムのために隠しIDフィールドを追加する必要があります。サポートが必要です。 – Ravindra

答えて

0

私はこの問題の解決策を見つけました。私がlineitemを更新しようとすると、それは新しいものとして取るので、更新アクションのために非表示のlineitem_idを渡さなければなりません。私は、コードの下に を使用しています

<%= hidden_field_tag "expense[expense_line_items_attributes][#{index}][id]",expense_line_item.id%> 

、それが私のために動作します。

関連する問題