加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 具有多态模型的嵌套表单

发布时间:2020-12-17 02:11:33 所属栏目:百科 来源:网络整理
导读:我正在创建一个具有以下属性的应用程序,我正在创建一个单独的表单,以便能够保存目标,目标的任务,目标的里程碑和里程碑的任务. #app/models/goal.rb has_many :tasks,:as = :achievement has_many :milestones accepts_nested_attributes_for :tasks accepts_
我正在创建一个具有以下属性的应用程序,我正在创建一个单独的表单,以便能够保存目标,目标的任务,目标的里程碑和里程碑的任务.

#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,这似乎修复了它,但导致了其他问题,例如空白编辑表单(没有预先填充数据)并且里程碑和任务字段立即显示,而不是单击链接以显示空白字段.如果你无法解决它,有没有我可以支付其他程序员帮助解决这样的小问题的网站?我在这一点上很绝望.

解决方法

您的里程碑模型需要以下行才能接受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’Milestone’

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读