我正在制作一个具有以下属性的应用程序,并且我正在创建一个能够保存目标、目标任务、目标里程碑和里程碑任务的单一表单。
#app/models/goal.rb
has_many :tasks, :as => :achievement
has_many :milestones
accepts_nested_attributes_for :tasks
accepts_nested_attributes_for :milestones
#app/models/milestone.rb
belongs_to :goal
has_many :tasks, :as => :achievement
#app/models/task.rb
belongs_to :achievement, :polymorphic => true
每当我用它的属性保存一个目标时,似乎任务模型对它们属于什么成就类型感到困惑,导致每个里程碑任务都被列为目标任务。我的表单、部分代码和控制器代码如下。
形式:
<%= nested_form_for @goal do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'shared/goal_fields', :f => f %>
<%= f.fields_for :milestones do |ff| %>
<%= render 'shared/milestone_fields', :f => ff %>
<% end %>
<%= f.fields_for :tasks do |ff| %>
<%= render 'shared/task_fields', :f => ff %>
<% end %>
<%= f.link_to_add "Add Milestone", :milestones %>
<%= f.link_to_add "Add Task", :tasks %>
<%= f.submit %>
<% end %>
里程碑字段部分:
<%= f.label :content, "Milestone" %>
<%= f.text_field :content %>
<%= f.fields_for :tasks do |ff| %>
<%= render 'shared/task_fields', :f => ff %>
<% end %>
<%= f.link_to_remove "Remove milestone" %>
<%= f.link_to_add "Add Milestone Task", :tasks %>
task_fields 部分:
<%= f.label :content, "Task" %>
<%= f.text_field :content %>
<%= f.link_to_remove "Remove Task" %>
目标控制器:
def new
@goal = current_user.goals.new
end
def create
@user = current_user
@goal = @user.goals.build(params[:goal])
if @goal.save
flash[:success] = "Goal created!"
redirect_to goals_path
else
render 'new'
end
end
我尝试在 f.fields_for 代码旁边添加@goal.milestones.build 和@goal.tasks.build,这似乎已经修复了它,但会导致其他问题,例如空白编辑表单(没有预先填充数据)并且里程碑和任务字段立即显示,而不是单击链接以显示空白字段。如果您无法解决,是否有任何网站可以让我向其他编码人员付费以帮助解决此类小问题?在这一点上我很绝望。