2016-11-09 87 views
0

我有Proposal模型,has_one Quote与simple_form嵌套模型的路由

我正在使用simple_form同时创建两个对象。 事情是,我想报价是另一个报价的克隆,属于另一个型号Brief。在我的控制器,这看起来像:

def new 
    @proposal = Proposal.new 
    @brief = Brief.find(params[:brief_id]) 
    @proposal.brief = @brief 
    @invoice_quote_element = @brief.invoice_quote_element.deep_clone include: [ :expense_categories, { expense_categories: :expenses } ] 
end 

在我看来,我添加了形式

<%= simple_form_for [@proposal.brief, @proposal, @invoice_quote_element] do |f| %> 

但是,这并不工作,我得到了以下错误:

undefined method `brief_proposal_invoice_quote_elements_path' 

我的路线似乎干净给我:

resources :proposals do 
    resources :invoice_quote_element 
    member do 
     get 'edit_legal' 
     patch 'update_legal' 
     get 'quote' 
     get 'view_quote' 
     get 'download_quote' 
    end 
    end 

现在,如果我从simple_form删除@invoice_quote_element

<%= simple_form_for [@proposal.brief, @proposal] do |f| %> 

的形式显示就好了,但我不能提交,因为create方法提出了一个新的错误:

Couldn't find InvoiceQuoteElement with ID=299 for Proposal with ID= 

回答

2

如果你不“T指定:url PARAM形式,Rails FormHelper将使用polymorphic_path来生成表单操作URL。欲了解更多信息,你可以访问Here。由于路径未定义,您会得到第一个错误。当您删除@invoice_quote_element时,生成的路径将为brief_proposals_path,这可能是在您的路由文件中定义的,因此它可以工作。但是当你提交表单时,Rails将运行控制器proposals的方法create,这可能会导致错误。您应该检查日志以了解哪个控制器和操作被调用。在你的情况下,我认为<%= simple_form_for [@proposal, @invoice_quote_element] do |f| %>应该工作。

+0

那么,出于某种原因,它没有。我想到了,我在我的路线中添加了匹配的资源,但是当我将它转换为<%= simple_form_for [@proposal,@invoice_quote_element] do | f | %>,我得到这个:未定义的方法'proposal_invoice_quote_elements_path'。我不明白为什么invoice_quote_elements是一个复数,而提案只附加了一个。 –

+0

“@ invoice_quote_element”为零,所以invoice_quote_elements为复数,因为它在上面的链接中识别新记录并映射到集合。您将资源更改为'resources:invoice_quote_elements',它应该可以工作。 – phamhoaivu

+0

确实,它的工作!现在它引发了一个新的错误:没有路由匹配{:action =>“index”,:controller =>“invoice_quote_elements”,:proposal_id => nil}缺少必需的键:[:proposal_id],这是很正常的,因为我们建议#new''',因此建议还没有id ... –