0

Использование 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"} 
+1

Это может быть опечатка, но в строке '@ wiki.update_attributes (Params [: пост ]) 'почему вы обновляетесь с параметрами [: post]? Я не вижу модель Post в любом месте вашего кода, это должно быть 'params [: wiki]' –

+0

Awesome - Не могу поверить, что я пропустил это. Скопирован над другим контроллером и пропустил этот. Теперь появилась новая ошибка, процитированная выше. – Sasha

+0

Можете ли вы добавить свой параметр hash? (Должен быть на странице с рельсами exeption, когда вы получаете Невозможно назначить массовую ошибку). Ваши accepts_nested_attributes_for выглядят правильно, но должен быть символ ** notes **, переданный где-то вдоль строк – Kocur4d

ответ

1

У вас есть один ко многим fields_for вызова в вашем представлении. Основное правило состоит в том, чтобы иметь один fields_for вызов для каждого accepts_nested_attributes_for call.

изменение вики/_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" 

к:

.field_inset 
    .add_inset 
     .remove 
     = f.text_field :name 
     = f.text_field :info, class: "no_margin" 
     = link_to "remove", '#', class: "remove_fields" 

Я не Haml парень, так что я не уверен на 100% этот код действителен, но основная идея заключается в удалении полей для вызова.

Your notes_attributes хэш выглядит следующим образом:

"notes_attributes"=>{"0"=>{"notes"=>{"name"=>"New Notes Name", 
            "info"=>"New Notes Info"}, "id"=>"1"}} 

И он должен:

"notes_attributes"=>{"notes"=>{"name"=>"New Notes Name", 
           "info"=>"New Notes Info"}} 
+0

GENIUS! Спасибо. Это меня сбило с ума. Не могу поверить, что я пропустил это. – Sasha

+0

:) Не проблема Я бы заметил это намного быстрее с erb ... ну, я должен научиться haml – Kocur4d

Смежные вопросы