我有一个处理嵌套属性的表单(我认为)。
project
has_many graphs
,通过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
答案 0 :(得分: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模型中使用回调来在每次创建项目时创建一个回调。