Использование Nested Model Form (revised) Railscast, чтобы попытаться создать страницу с вложенными моделями, которые могут быть обновлены сразу. У Вики есть много тем, у которых много заметок.Вложенные модели не обновляются
Проблема состоит в том, что: a) ранее существовавшие данные не заполняют поля так, как если бы они выполнялись правильно, и b) удар по обновлению не вызывает никаких ошибок (и на самом деле это показывает баннер успеха), но он ничего не делает.
Вот мой код:
вики, тема, note.rb (комбинированный для чтения, а не в действительности):
class Wiki < ActiveRecord::Base
attr_accessible :topics_attributes
has_many :topics
accepts_nested_attributes_for :topics, :allow_destroy => true
end
class Topic < ActiveRecord::Base
attr_accessible :name, :notes_attributes, :wiki_id
has_many :notes
belongs_to :wiki
accepts_nested_attributes_for :notes, :allow_destroy => true
end
class Note < ActiveRecord::Base
attr_accessible :name, :info, :topic_id
belongs_to :topic
end
wikis_controller.rb
Я делая wiki.first, потому что мне нужна только одна вики. Модель существует, поэтому я могу обновлять зависимые модели через один объект. У меня никогда не будет больше одной вики.
class WikisController < ApplicationController
before_filter :authorize
def show
@wiki = Wiki.first
end
def edit
@wiki = Wiki.first
end
def update
@wiki = Wiki.first
respond_to do |format|
if @wiki.update_attributes(params[:wiki])
format.html { redirect_to wikis_path, notice: 'Wiki was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: "edit" }
format.json { render json: @wiki.errors, status: :unprocessable_entity }
end
end
end
end
routes.rb # Я хочу только один «вики», и я хочу, маршрут для того, чтобы быть/вики получить «вики», чтобы: «Глобальное # шоу», как: " дом» ресурсы: вики
вики/edit.html.haml
.row.container.wiki
%h1{ :style => 'margin-bottom: 40px'} Update the Wiki
= form_for @wiki do |w|
= w.fields_for :topics do |builder|
= render "topic_fields", f: builder
= link_to_add_fields "add topic", w, :topics
%br
= w.submit "Update", class: "btn"
вики/_topic_fields.html.haml
.field_inset
= f.text_field :name
= f.hidden_field :_destroy
= link_to "remove", '#', class: "remove_fields"
= f.fields_for :notes do |builder|
= render 'note_fields', f: builder
вики/_notes_fields.html.haml
.field_inset
.add_inset
= f.fields_for :notes do |builder|
.remove
= builder.text_field :name
= builder.text_field :info, class: "no_margin"
= link_to "remove", '#', class: "remove_fields"
Классы в основном для укладки, за исключением remove_fields, который вызывает некоторые JavaScript. Любая идея, что я делаю неправильно здесь? Я очень взволнован этим.
NEW ОШИБКА
После фиксации моего действия обновления в wikis_controller (который используется для ссылки на Params [: пост], по ошибке), теперь я получаю эту ошибку, когда я пытаюсь представить обновленную информацию. Тем не менее, эти поля НЕ уже заполнены:
Can't mass-assign protected attributes: notes
я бы подумал, что: topics_attributes и: notes_attributes будет заботиться об этом ??
ТАКЖЕ, стоит отметить, что, хотя поля Notes не являются предварительно заполненными, поле «Темы».
EDIT - PARAMS хэш от масс- правопреемником ошибки ниже
Похоже, что PARAMS становятся прошли правильно
{"utf8"=>"✓",
"_method"=>"put",
"authenticity_token"=>"3/4k8eEa4/PfeNI9cSj7zqCm9+scWBS3gwEacmc/hd0=",
"wiki"=>{"topics_attributes"=>{"0"=>{"name"=>"Pre-existing Topic Name",
"_destroy"=>"false",
"notes_attributes"=>{"0"=>{"notes"=>{"name"=>"New Notes Name",
"info"=>"New Notes Info"},
"id"=>"1"}},
"id"=>"1"}}},
"commit"=>"Update",
"id"=>"1"}
Это может быть опечатка, но в строке '@ wiki.update_attributes (Params [: пост ]) 'почему вы обновляетесь с параметрами [: post]? Я не вижу модель Post в любом месте вашего кода, это должно быть 'params [: wiki]' –
Awesome - Не могу поверить, что я пропустил это. Скопирован над другим контроллером и пропустил этот. Теперь появилась новая ошибка, процитированная выше. – Sasha
Можете ли вы добавить свой параметр hash? (Должен быть на странице с рельсами exeption, когда вы получаете Невозможно назначить массовую ошибку). Ваши accepts_nested_attributes_for выглядят правильно, но должен быть символ ** notes **, переданный где-то вдоль строк – Kocur4d