Ruby on rails 3 更新操作触发插入查询?
嗨,我知道这很傻,但我是在编辑任何条目时得到的 我有一个费用模型、一个费用行项目和一个付款行项目模型,当我创建一个新条目时,它会正确创建,但在编辑以前的条目时,它会添加一个新条目,而不是更新,即。E在更新操作时,它触发插入查询。这是我的密码: 我的控制器:Ruby on rails 3 更新操作触发插入查询?,ruby-on-rails-3,sqlite3-ruby,Ruby On Rails 3,Sqlite3 Ruby,嗨,我知道这很傻,但我是在编辑任何条目时得到的 我有一个费用模型、一个费用行项目和一个付款行项目模型,当我创建一个新条目时,它会正确创建,但在编辑以前的条目时,它会添加一个新条目,而不是更新,即。E在更新操作时,它触发插入查询。这是我的密码: 我的控制器: def new @menu = 'Expenses' @page_name = 'Record New Expenses' @expense = Expense.new @expense
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
费用模型:
类费用lambda{a | a[:帐户(id)]。空白?},:允许(销毁=>true
接受以下项目的嵌套属性::paid_line_items,:reject_if=>lambda{a | a[:account_id]。blank?},:allow_destroy=>true
#验证
验证是否存在:费用日期、凭证号
验证是否存在:费用项目
验证\u关联:费用\u行\u项目
验证是否存在:已付款项目
验证关联的项目:已付款项目
终止
费用项目:
class ExpenseLineItem < ActiveRecord::Base
belongs_to :expense
end
class PaidLineItem < ActiveRecord::Base
belongs_to :expense
end
class ExpenseLineItem
已付款项目:
class ExpenseLineItem < ActiveRecord::Base
belongs_to :expense
end
class PaidLineItem < ActiveRecord::Base
belongs_to :expense
end
class PaidLineItem
我的表格:
<%= 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 %>
费用项目:索引=>索引%>
:add_row,:index=>@expense.expense_line_items.size},:remote=>true%>
已付款项目:索引=>索引%>
:将\添加到\行,:index=>@expense.paid\行\ items.size},:remote=>true%>
我很沮丧,提前谢谢你 我找到了解决这个问题的办法。当我尝试更新一个lineitem时,它会将其视为一个新的lineitem,因此我必须为更新操作传递一个隐藏的lineitem_id。我用过 以下代码:
<%= hidden_field_tag "expense[expense_line_items_attributes][#{index}][id]",expense_line_item.id%>
这对我来说很有效。我看不出上述代码有任何明显的错误。控制器看起来没问题,所以问题可能在于传递给update的@params。我们无法在看不到其他视图的情况下真正判断这些参数是什么。你能把它们寄出去吗?(expense\u line\u item和paid\u line\u item视图)能否在更新函数的开头添加一个“raise params.inspect”并将输出粘贴到此处?感谢@rahul我发现错误,这是由于我忘记在我的line items中添加代码所致。我必须为我的line item添加一个隐藏的id字段。感谢支持。