Ruby on rails Rails 4嵌套属性不向当前项目添加记录,而是将其';正在添加新的项目记录

Ruby on rails Rails 4嵌套属性不向当前项目添加记录,而是将其';正在添加新的项目记录,ruby-on-rails,ruby,ruby-on-rails-4,nested-attributes,cocoon-gem,Ruby On Rails,Ruby,Ruby On Rails 4,Nested Attributes,Cocoon Gem,项目更新的记录将上载到新的项目记录中 我尝试将cocoon gem用于嵌套属性,但它会添加新的项目记录,而不仅仅是在同一项目中添加新的项目更新 我的/views/projects/show.html.haml = form_for @pu do |f| #updates = f.simple_fields_for :project_updates do |u| = render 'update_fields', f: u .links = link_to_ad

项目更新的记录将上载到新的项目记录中

我尝试将cocoon gem用于嵌套属性,但它会添加新的项目记录,而不仅仅是在同一项目中添加新的项目更新

我的/views/projects/show.html.haml

= form_for @pu do |f|
  #updates
    = f.simple_fields_for :project_updates do |u|
      = render 'update_fields', f: u
  .links
    = link_to_add_association 'add updates', f, :project_updates, class: "button"
  = f.submit "Submit updates", class: "button"
然后在我的项目中\u controller.rb

def show
  @pu = Project.new
end

def create
  @project = Project.new(project_params)

  respond_to do |format|
    if @project.save
      format.html { redirect_to @project, notice: 'Project was successfully created.' }
      format.json { render :show, status: :created, location: @project }
    else
      format.html { render :new }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end

private

  def project_params
    params.require(:project).permit(:name, :address, :client, :budget,
      project_updates_attributes: [:updates, :notes, :done, :impact_schedule, :impact_budget, :_destroy])
  end
如果可能的话,我想在同一个项目中不断添加记录

编辑、添加编辑和更新

def edit
end

def update

  respond_to do |format|
    if @project.update(project_params)
      format.html { redirect_to @project, notice: 'Project was successfully updated.' }
      format.json { render :show, status: :ok, location: @project }
    else
      format.html { render :edit }
      format.json { render json: @project.errors, status: :unprocessable_entity }
    end
  end
end
只是标准的编辑和更新脚手架

仍然存在在显示页面(project show page)中应用嵌套属性(表单)的问题,并且当尝试在项目中添加新任务时,它会添加新的项目记录并包括新项目中的任务,而不是更新当前项目中的任务。如果有可能的话,我会很感激你帮我重写我所拥有的、需要修复的东西

编辑:

根据帮助,结果如下:

状态1已添加(单击提交更新),但是,当我刷新页面时,会显示状态1输入字段,然后当我尝试添加另一个更新(状态2)时,会填充原始状态1(除了新的更新),因此会连续添加以前添加的记录。我只希望这个显示页面只向记录中添加新的更新,而不在输入字段中显示现有记录

编辑2:

显示页面中的新表单,必须根据下面的建议答案删除
url
,因为它没有给我任何路由错误

= simple_form_for @project do |f|
  #updates
    = f.simple_fields_for :project_updates do |u|
      = render 'project_update_fields', f: u
  .links
    = link_to_add_association 'add updates', f, :project_updates, class: "button"
  = f.submit "Submit updates", class: "button"
\u项目\u更新\u字段。haml部分

.nested-fields
  = f.input :updates, placeholder: "Updates", label: false
  .small-2.column
    = f.input :impact_budget, as: :boolean
  .small-2.column  
    = f.input :impact_schedule
  .small-12.column
    = link_to_remove_association "remove task", f, class: "button"

首先,您需要将您的操作分为创建和更新。这样您就可以更新现有记录

您的更新操作将非常类似,但不是

@project = Project.new(...)
大概是

@project = Project.find(params[:project_id])
此外,您还需要调用
@project.update_attributes(project_params)
,而不是
@project.save

祝你好运如果您有任何问题,请提问。

有几个问题需要解决

首先也是最重要的是:

def show
  # instantiating new project_update is not even needed, nested_attributes will do that for you
  @pu = Project.new
end
要能够更新现有项目,您需要执行以下操作:

# change the show so that it finds the project which are at now:

def show
  # find a project we want to add updates to
  @project = Project.find(params[:id])
end

# edit the form a bit
= form_for(@project, url: projects_path(@pu)) do |f| # <===, not nessecary though. Should work as you have it as well
  #updates
    = f.simple_fields_for :project_updates do |u|
      = render 'update_fields', f: u
# making sure, that simple_fields_for are only displayed for new update object's creation
- if f.object.new_record?
  .nested-fields
    = f.input :updates, placeholder: "Updates", label: false
    .small-2.column
      = f.input :impact_budget, as: :boolean
    .small-2.column  
      = f.input :impact_schedule
    .small-12.column
      = link_to_remove_association "remove task", f, class: "button"

我为什么要将
Project.new(..)
更改为
Project.find(params[:Project\u id])
?我正在尝试为现有项目显示页面创建一个嵌套属性,用户可以在该页面中更新项目中的项目状态。另外,创建操作中的
@project.save
是用于我创建新项目时的,不是吗?当然,但您也希望更新内容,对吗?为此,您需要一个名为
update
的新操作,并且在该操作中,您应该替换我所述的方法。您编写的代码没有问题,但每次都会创建新项目。如果你想更新一个项目,你需要按照我给你的指示进行新的操作。如果我不够清楚,很抱歉。那
@pu=Project.new
呢?因为显示页面中的这个表单是要
action=“/projects”
。也许我需要改变这个?因为如果我更改原始的scaffold项,它会影响我创建新项目的时间,对吗?new中的页面应该是post to/projects。您还应该有一个
edit
操作,带有一个编辑视图,以及一个到/projects的表单补丁。在rails中,这与说edit_project_path(project_ID)相同,所以我想这是我的问题。我不是想发布一个新项目,我只是想在项目中添加新任务。我在项目的显示页面,有一个表单只添加更新。如果它的to
/projects
没有创建新项目,而不是“项目更新”(让我们调用任务)?很抱歉,我的n00b问题,我正在努力理解,希望能让这个工作。也许我一直在混淆更新和任务您缺少
edit
update
操作,或者您只是忽略了向我们显示它们吗?@nathanvda我更新了我的问题,这只是标准的脚手架操作现在保存记录,但它还添加了以前的记录以及我尝试更新的新记录。当我在“项目显示”页面中时,它会在输入字段中显示记录,就像我在编辑表单一样。这有意义吗?如何防止这种情况发生?@hellomello
当我在“项目显示”页面时,它会在输入字段中显示记录,就好像我在编辑表单一样。
,想想看——您在“显示”页面上,更新现有记录是合乎逻辑的。我能请你写下你关心的是什么吗?因为不幸的是我不明白。我以为您希望表单正常工作,并在项目页面上向现有项目添加新的
project\u更新。你说它正在工作,所以现在我想知道还有什么要做,这样我可以进一步帮助你:)嗨!非常感谢你的帮助。我已经更新了我的OP以截图我的问题。希望它有意义@hellomello很简单,这是部分代码的问题。请,张贴部分,我会告诉你,如何只添加新的更新:)谢谢!我更新了我的操作。但是你会看到我不得不修改了你建议的一些表单。