2014-01-26 83 views
0

我有一個窗體,處理嵌套屬性(我認爲)。窗體不顯示它的嵌套屬性塊

A project has_many graphs,through project_graph

在我的表單中,嵌套屬性的代碼塊永遠不會呈現。有任何想法嗎?

查看

<%= form_for(@project, :html => { class: :form }) do |f| %> 
    <%= f.fields_for :project_user_graphs do |graph_form| %> <!-- this never renders --> 
     <p>How come this block never is executed? This wont show up.</p> 
    <% end %> 
    <%= f.submit class: "btn btn-primary" %> 
<% end %> 

模式

class UserGraph < ActiveRecord::Base 
    has_many :project_user_graphs 
    has_many :projects, through: :project_user_graph 
    accepts_nested_attributes_for :project_user_graphs, allow_destroy: true, reject_if: lambda {|attributes| attributes['user_graph_id'].blank?} 
end 

class Project < ActiveRecord::Base 
    has_many :project_user_graphs 
    has_many :user_graphs, through: :project_user_graph 
    accepts_nested_attributes_for :project_user_graphs, allow_destroy: true, reject_if: lambda {|attributes| attributes['user_graph_id'].blank?} 
end 
+1

也許沒有關聯的實例。在你的控制器中,你是否做了類似'@project.project_user_graphs.build'的東西? – aceofspades

回答

0

Aceofspades是正確的,fields_for將爲每個現有項目字段 - 它不會對於沒有一個項目創建字段存在。基本上發生了什麼是你的@project還沒有project_user_graphs。如果您添加:

<%= f.fields_for :project_user_graphs, @project.project_user_graphs.new do |g| %> 

它會爲您在現場創建一個新圖形,然後顯示該字段。然而,這通常不是你想做的事 - 相反,您要創建在控制器中project_user_graph:

@project.project_user_graphs.build 

或者如果你確信每個項目都會有,你可以使用一個回調project_user_graph Project.rb模型在每次創建項目時創建一個。