0

我有一个主题模型和一个课程模型。我实现了一个嵌套模型表单。

创建主题后,我将其引导至一个页面,该页面据称显示了相关的课程。但是,我看不到教训。

我相信课程的数据没有正确保存,因为当我执行例如课程.find_by_subject_id('1') 时,我得到'nil' 作为回报。

我试图弄清楚多态性是如何在 Rails 上工作的,如果有人能指出我哪里出了问题,或者给我一些关于如何传递要创建的belong_to 类的值的指导,我将不胜感激。

主题模型

attr_accessible :subjectCode, :lessons_attributes
has_many :lessons, :dependent => :destroy
accepts_nested_attributes_for :lessons, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true

课程模型

attr_accessible :lessonName, :subject, :subject_id
belongs_to :subject

主题控制器

def new
3.times {@subject.lessons.build}
end

def create
  @subject = Subject.new(params[:subject])
  if @subject.save
    redirect_to @subject, :notice => "Successfully created subject."
  else
    render :action => 'new'
  end
end

形式

<%= form_for @subject do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :subjectCode %><br />
    <%= f.text_field :subjectCode %>
  </p>

  <%= f.fields_for :lessons do |builder| %>
    <p>    
    <%= builder.label :lessonName %> <br/>
    <%= builder.text_area :lessonName, :rows=>3 %>
    </p>
  <% end %>
  <p><%= f.submit "Submit" %></p>
<% end %>

路线资源:科目做资源:课程结束

4

2 回答 2

1

您的reject_iflambda 将始终拒绝课程属性,因为课程没有content属性,因此您实际上是在评估nil.blank?哪个会返回true

也许您想检查课程名称是否为空?翼:reject_if => lambda { |a| a[:lessonName].blank? }

于 2012-11-02T00:15:31.470 回答
1

content在表单上没有课程字段,因此content每节课都是空白的。你还使用:

:reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true 

这将检查内容是否为空白,主题不会保存课程。这是您的问题,因为您的表单上没有内容字段,因此每次创建主题时内容都会空白,您使用:reject_if了主题不会保存其课程。如果您以后可以放置课程内容,请删除:reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true ,您的课程将与相关主题一起保存。

于 2012-11-02T07:53:48.233 回答