Вложенные атрибуты Rails 4 не добавляют запись в текущий проект, вместо этого добавляются новые записи проекта

И записи из обновлений проекта загружаются в новую запись проекта.

Я пытаюсь использовать драгоценный камень кокона для вложенных атрибутов, но добавляю новую запись проекта, а не просто добавляю новые обновления проекта в тот же проект.

У меня есть форма в моем /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"

Затем в моем projects_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

Просто стандартное редактирование и обновление скаффолда.

По-прежнему возникает проблема с применением вложенного атрибута (формы) внутри страницы показа (страницы показа проекта), и при попытке добавить новые задачи в проект он добавляет новую запись проекта и включает задачи в этот новый проект вместо обновление задач в текущем проекте. Если возможно помочь переписать то, что у меня было, исправить, буду признателен.

РЕДАКТИРОВАТЬ:

Согласно справке, это результат:

введите здесь описание изображения введите здесь описание изображения

Был добавлен статус 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"

_project_update_fields.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"

person hellomello    schedule 01.02.2016    source источник
comment
Вы пропустили действия edit и update или просто не показали их нам?   -  person nathanvda    schedule 03.02.2016
comment
@nathanvda Я обновил свой вопрос, это просто стандартные строительные леса.   -  person hellomello    schedule 03.02.2016


Ответы (2)


Есть несколько вопросов, над которыми нужно работать.

Первое и самое главное здесь:

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"
person Andrey Deineko    schedule 06.02.2016
comment
Теперь он сохраняет записи, но также добавляет предыдущие записи с новыми записями, которые я пытаюсь обновить. Когда я нахожусь на странице показа проекта, он показывает записи в полях ввода, как будто я редактирую форму. Имеет ли это смысл? Как мне предотвратить это? - person hellomello; 08.02.2016
comment
@hellomello When I'm in the project show page, it shows the records in the input fields as if I'm editing the form., подумайте об этом - вы находитесь на странице шоу, логично, что вы обновляете существующую запись. Могу я попросить вас написать, что вас беспокоит? Потому что я, к сожалению, этого не понимаю. Я думал, вы хотите, чтобы форма работала и добавляла новые project_updates в существующий проект на странице проекта. Вы говорите, что это работает, так что теперь я хотел бы знать, что еще нужно сделать, чтобы я мог помочь вам в дальнейшем :) - person Andrey Deineko; 08.02.2016
comment
Привет! Большое спасибо за помощь. Я обновил свой OP, чтобы сделать скриншоты моих проблем. Надеюсь, это имеет смысл! - person hellomello; 08.02.2016
comment
@hellomello это очень просто, это вопрос частичного кода. Пожалуйста, опубликуйте часть, и я покажу вам, как добавлять только новые обновления :) - person Andrey Deineko; 08.02.2016
comment
Спасибо! Я обновил свой ОП. Но вы увидите, что мне пришлось немного изменить предложенную вами форму. - person hellomello; 08.02.2016
comment
@hellomello эй, нет проблем, рад, что это сработало, как вы ожидали :) Итак, я полагаю, вы принимаете мой ответ? ооо, хорошо, я не заметил, что ты назначил награду :D - person Andrey Deineko; 08.02.2016

Прежде всего, вам нужно разделить свои действия на создание и обновление. Таким образом, вы можете обновить существующую запись.

Ваше действие по обновлению будет очень похожим, но вместо

@project = Project.new(...)

Это будет что-то вроде

@project = Project.find(params[:project_id])

Кроме того, вы захотите позвонить @project.update_attributes(project_params) вместо @project.save Удачи. Если у вас есть какие либо вопросы, пожалуйста спрашивайте.

person Jonas Meinerz    schedule 01.02.2016
comment
Почему я хочу изменить Project.new(..) на Project.find(params[:project_id])? Я пытаюсь создать вложенный атрибут для существующей страницы показа проекта, где пользователи могут обновлять статус проекта в рамках проекта. Кроме того, @project.save в действии создания предназначено для создания нового проекта, не так ли? - person hellomello; 02.02.2016
comment
Конечно, но вы также хотите обновить вещи, верно? Для этого вам нужно новое действие с именем update, и в этом действии вы должны заменить методы, как я сказал. В коде, который вы написали, нет ничего плохого, но он просто каждый раз создает новые проекты. Если вы хотите обновить проект, вам нужно новое действие с инструкциями, которые я вам дал. Извините, если я был недостаточно ясен. - person Jonas Meinerz; 02.02.2016
comment
А как насчет @pu = Project.new? Потому что эта форма на странице шоу предназначена для action="/projects". Может быть, мне нужно изменить это? Потому что, если я изменю исходные элементы каркаса, это повлияет на создание новых проектов, верно? - person hellomello; 02.02.2016
comment
Страница в новом должна быть записью в /projects. У вас также должно быть действие edit с представлением редактирования и формой PATCH для /projects. В рельсах это то же самое, что сказать edit_project_path(PROJECT_ID) - person Jonas Meinerz; 02.02.2016
comment
Так что я думаю, что это моя проблема здесь. Я не пытаюсь опубликовать новый проект, я только пытаюсь добавить новые задачи в рамках проекта. Я нахожусь на странице шоу проекта, и там есть форма, которая только добавляет обновления. Если это /projects, разве это не создает новый проект, а не обновление проекта (позволяет вызывать задачи)? Извините за мои вопросы n00b, я пытаюсь понять и, надеюсь, заставить это работать. Может быть, я запутал вас между обновлениями и задачами - person hellomello; 02.02.2016