2011-10-11 84 views
1

我有一个模型的设置,其中用户可以创建与每个问题的许多问题和许多答案测验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时,它显示更新的问题和答案,但是在更新页面后它们不会被保留。

我从来没有遇到过这样的问题,并且无法找到原因,任何人都可以分享一些见解吗?

谢谢!

按照要求,控制器代码:(测验是页的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所以更新属性被传递零的而不是实际的数据

+0

您是否在模型定义中使用attr_accessble? – lucapette

+0

nope,我找的第一件事 – Jimmy

+0

你的控制器的后源,处理更新的测验 – Hck

回答

0

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