表单不显示其嵌套的属性块

时间:2014-01-26 23:43:45

标签: ruby-on-rails ruby-on-rails-4 nested-attributes

我有一个处理嵌套属性的表单(我认为)。

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

1 个答案:

答案 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模型中使用回调来在每次创建项目时创建一个回调。