我正在创建一个具有以下属性的应用程序,我正在创建一个单独的表单,以便能够保存目标,目标的任务,目标的里程碑和里程碑的任务。
#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 %>
milestone_fields partial:
<%= 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 partial:
<%= 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,这似乎修复了它,但导致了其他问题,例如空白的编辑表单(没有数据是预先的-populated)并立即显示里程碑和任务字段,而不是单击链接以显示空白字段。如果你无法解决它,有没有我可以支付其他程序员帮助解决这样的小问题的网站?我在这一点上很绝望。
答案 0 :(得分:2)
您的里程碑模型需要以下行才能接受tasks_attributes:
# app/models/milestone.rb
accepts_nested_attributes_for :tasks
模特中的其他一切看起来都不错。至于fields_for表单助手,传递构建将创建指定对象的新实例,这将导致您描述的空白编辑表单。如果nested_form_for将处理构建和附加这些新表单字段,请尝试删除这些构建。
我重新创建了你的环境,当我发布我的表单时,我在服务器日志中得到以下params哈希:
{"goal"=>{"milestones_attributes"=>{"0"=>{"content"=>"foo", "tasks_attributes"=>{"0"=>{"content"=>"bar"}}}}, "tasks_attributes"=>{"0"=>{"content"=>"baz"}}}}
这创建了两个任务记录,一个是achievement_type'目标',另一个是achievement_type'里程碑'
至于付钱给某人做这项工作,http://www.rent-acoder.com/是一个网站,我听过有人说他们已经接受了过去的工作。我不能代表代码的质量,但你可以发帖你的工作,看看你得到了什么。