具有多态模型的嵌套形式

Gra*_*man 5 ruby-on-rails nested-forms form-for polymorphic-associations ruby-on-rails-3

我正在制作一个具有以下属性的应用程序,我正在创建一个单一的表单,以便能够保存一个目标、一个目标的任务、一个目标的里程碑和一个里程碑的任务。

#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
Run Code Online (Sandbox Code Playgroud)

每当我用它的属性保存目标时,任务模型似乎对它们属于什么成就类型感到困惑,导致每个里程碑任务都被列为目标任务。我的表单、部分和控制器代码如下。

形式:

<%= 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 %>
Run Code Online (Sandbox Code Playgroud)

里程碑字段部分:

  <%= 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 %>
Run Code Online (Sandbox Code Playgroud)

task_fields 部分:

  <%= f.label :content, "Task" %>
  <%= f.text_field :content %>
  <%= f.link_to_remove "Remove Task" %>
Run Code Online (Sandbox Code Playgroud)

目标控制器:

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 
Run Code Online (Sandbox Code Playgroud)

我尝试在 f.fields_for 代码旁边添加 @goal.milestones.build 和 @goal.tasks.build ,这似乎已修复它,但导致其他问题,例如空白编辑表单(没有预先填充数据)并且会立即显示里程碑和任务字段,而不是单击链接以显示空白字段。如果你不能解决它,有什么网站可以让我付钱给其他编码员来帮助解决这样的小问题?此刻我很绝望。

Ben*_*son 2

您的 Milestone 模型需要以下行才能接受task_attributes:

# app/models/milestone.rb
accepts_nested_attributes_for :tasks
Run Code Online (Sandbox Code Playgroud)

模型中的其他一切看起来都不错。至于 fields_for 表单助手,传递 build 将创建指定对象的新实例,这将导致您描述的空白编辑表单。如果nested_form_for要处理构建和附加这些新的表单字段,请尝试删除这些构建。

我重新创建了您的环境,当我发布表单时,我在服务器日志中收到以下参数哈希:

{"goal"=>{"milestones_attributes"=>{"0"=>{"content"=>"foo", "tasks_attributes"=>{"0"=>{"content"=>"bar"}}}}, "tasks_attributes"=>{"0"=>{"content"=>"baz"}}}}
Run Code Online (Sandbox Code Playgroud)

这创建了两条任务记录,一条为 Achievement_type“Goal”,另一条为 Achievement_type“Milestone”

至于花钱请人做这项工作,http://www.rent-acoder.com/是一个网站,我听人们说他们接受了过去的工作。我不能代表代码的质量,但你可以发布你的作品,看看你得到了什么。

  • 格兰特,我想你已经差不多了解了这段代码了。让我们将故障排除保留在 Stack Overflow 中,以便其他人可以看到解决方案。尝试将问题剥离到基本要素,然后在基本要素起作用后在其之上分层附加代码。在引入“nested_form_for”之前尝试使用“form_for”并使其正常工作。当您提交表单时,您的 params 哈希值是什么样的? (2认同)