Rails 3.1: вложенные атрибуты не сохраняются через форму - PullRequest
0 голосов
/ 15 января 2012

Я подозреваю, что это может быть очень простой ошибкой, но я потратил 3 часа на ее поиск, поэтому подумал, что могу попросить помощи у сообщества.

Я бегу через превосходные скринкасты Райана Бейтса на «Вложенных модельных формах» и пытаюсь применить их к моему собственному проекту. Проблема в том, что вложенный атрибут не сохраняется с помощью формы. Я могу получить его для сохранения через консоль, но он отображается только в виде пустых скобок при прохождении через форму.

Вот соответствующий код:

Представление формы (с использованием haml)

= form_for(@article) do |f|
  - if @article.errors.any?
    #error_explanation
      %h2
        = pluralize(@article.errors.count, "error")
        prohibited this article from being saved:
        %ul
          - @article.errors.full_messages.each do |msg|
            %li= msg
  .field
    = f.label :title
    %br/
    = f.text_field :title
  .field
    = f.label :intro
    %br/
    = f.text_area :intro
  = f.fields_for :subsections do |builder|
    = render 'subsections_fields', :f => builder
  .field
    = f.label :published_at
    %br/
    = f.text_field :published_at
  .actions
    = submit_or_cancel(f)

представление формы subsection_fields

= f.label :header
%br/
= f.text_field :header
= f.label :order_id
= f.number_field :order_id
%br/
= f.label :body
%br/
= f.text_area :body
%br/
= f.check_box :_destroy
= f.label :_destroy, "Remove Subsection"
%br/

Контроллер

class ArticlesController < ApplicationController
  def new
    @article = Article.new
    3.times { @article.subsections.build }
  end

  def create
    @article = Article.new(params[:article])

    if @article.save
      flash[:notice] = "Successfully created article."
      redirect_to @article
    else
      render :action => 'new'
    end
  end

  def edit
    @article = Article.find(params[:id])
  end

  def update
    @article = Article.find(params[:id])
    if @article.update_attributes(params[:article])
      flash[:notice] = "Successfully updated article."
      redirect_to @survey
    else
      render :action => 'edit'
    end
  end

  def destroy
    Article.find(params[:id]).destroy
    flash[:notice] = "Succesfully destroy article."
    redirect_to articles_url
  end

  def show
    @article = Article.find(params[:id])
  end

  def index
    @articles = Article.all
  end
end

и модели

class Article < ActiveRecord::Base
  attr_accessible :title, :intro

  has_many :subsections, :dependent => :destroy
  accepts_nested_attributes_for :subsections, :reject_if => lambda { |a| a[:body].blank? },
                                              :allow_destroy => true
  has_and_belongs_to_many :categories
  validates :title, :presence => true
end


class Subsection < ActiveRecord::Base
  attr_accessible :header, :body, :order_id

  belongs_to :article

  validates :header,  :presence => true
  validates :body,    :presence => true 
end

Любая помощь в выяснении этого очень ценится.

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Добавление «attr_accessible» к модели изменяет способ массового назначения в рельсах.

Если вы удалите строки "attr_accessible" в своих моделях, тогда весь ваш код будет работать без ошибок.

Метод класса "accepts_nested_attributes_for" добавляет метод "subsections_attributes = (value)"к вашей модели.

Когда вы добавляете «attr_accessible» в модель, вы теперь вынуждены добавлять дополнительные записи «attr_accessible» для каждого поля, которое вы хотите назначить с помощью массового назначения.т.е. когда вы используете Article.new (params [: article]).

Надеюсь, это было понятно.

1 голос
/ 15 января 2012

Я не совсем уверен, но попробуйте это с attr_accessible :article_id в вашей Subsection модели?

0 голосов
/ 22 февраля 2012

Я разобрался с ответом на этот вопрос от другого вопрос .

Ответ состоял в том, чтобы установить мой subsections_attributes как attr_accessible, поэтому приведенная выше модель Article должна выглядеть следующим образом (я также добавил published_at как attr_accessible):

class Article < ActiveRecord::Base
  attr_accessible :title, :intro, :subsections_attributes, :published_at

  has_many :subsections, :dependent => :destroy
  accepts_nested_attributes_for :subsections, :reject_if => lambda { |a| a[:body].blank? },
                                              :allow_destroy => true
  has_and_belongs_to_many :categories
  validates :title, :presence => true
end
...