Вложените атрибути на Rails 4 не добавят запис към текущия проект, вместо това добавят нови записи на проекта

И записите от актуализациите на проекта се качват в новия запис на проекта.

Опитвам се да използвам 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"

След това в моя 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
Благодаря! Актуализирах моята OP. Но ще видите, че трябваше да модифицирам малко формата, която предложихте. - 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
Страницата в new трябва да бъде публикация в /projects. Трябва също да имате действие edit, с изглед за редактиране, с формуляр PATCH към /projects. В rails това е същото като да кажете edit_project_path(PROJECT_ID) - person Jonas Meinerz; 02.02.2016
comment
Така че предполагам, че това е моят проблем тук. Не се опитвам да публикувам нов проект, а само да добавя нови задачи в проекта. Аз съм в страницата за показване на проекта и има формуляр, който добавя само актуализации. Ако е до /projects това не създава ли нов проект, а не актуализацията на проекта (нека извикваме задачи)? Съжалявам за моите n00b въпроси, опитвам се да разбера и се надявам да проработя. Може би съм ви бъркал между актуализации и задачи - person hellomello; 02.02.2016