Rails 3模型接受嵌套属性而不更新子项

时间:2011-10-11 13:56:43

标签: ruby-on-rails-3

我有一个模型设置,用户可以在每个问题上创建一个包含许多问题和许多答案的测验

模型看起来像这样:

model Page < AR::Base

end

model Quiz < Page
  has_many :questions
  accepts_nested_attributes_for :questions, :allow_destroy => true
end

model Question < AR::Base
  belongs_to :quiz
  has_many :answers
  accepts_nested_attributes_for :answers, :allow_destroy => true
end

model Answer < AR::Base
  belongs_to :question
end

我的表格看起来像这样:

= form_for @quiz do |f|

  f.fields_for :questions do |qf|
    # fields omitted, have fields for id, content, etc
    qf.fields_for :answers do |af|
      # fields omitted, have fields for id, answer, etc
  f.submit 'save'

当我仅编辑测验或添加新问题和答案时,一切都运行得非常好,但是当我编辑现有问题和答案时,更改不会保留在数据库中。我可以看到正确的嵌套参数被发送到控制器中,并在调用update_attributes后检查@quiz时显示更新的问题和答案,但在页面更新后它们不会被保留。

我之前从未遇到过这类问题,而且在查明原因时遇到问题,是否有人可以分享一些见解?

谢谢!

根据要求,控制器代码:(测验是Page的STI子类)

PagesController < ApplicationController
  def update
    @page = @section.pages.find(params[:id])

    if @page.update_attributes(params[@page.type.downcase.underscore])
      redirect_to online_course_section_pages_path(@online_course, @section), :notice => "Your page has been updated"
    else
      render :edit
    end
  end
end

编辑:

发现问题是因为使用@page.type.downcase.underscore而不是@page.type.underscore.downcase因此更新属性传递的是nil而不是实际数据

1 个答案:

答案 0 :(得分:0)

发现问题是因为使用@ page.type.downcase.underscore而不是@page.type.underscore.downcase所以更新属性传递的是nil而不是实际数据