2011-05-09 13 views
12

Yuvalanmış model formum ilk seviye derinlerde harika çalışıyor. Ama kabul seviyesinde çok fazla seviyelere kabul edebileceğiniz izlenimi aldım. Accepts_nested_attributes_for. Ancak, aşağıdaki kodu denediğimde, "Görüntü" öznitelikleri üst düzey "Soru" modeline eklenir ve bilinmeyen bir öznitelik "Resim" hatasıyla form gönderiminde kırılır.Raylar 3 Nested Model Form, accepts_nested_attributes_for öğesini kullanarak 2 düzey derin kullanın

Form verilerini kullanarak ekleri el ile yapabilirim, ancak Raylar otomatik olarak işleyebilirse, açık nedenlerle daha iyi olur.

Neyi yanlış yapıyorum? Değişimi denedim | af | "için alanlar: resim yapmak" kendi benzersiz adına ama herhangi bir etkisi yoktu.

Modeller:

class Question < ActiveRecord::Base 
    has_one :answer 
    accepts_nested_attributes_for :answer 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
    has_one :image 
    accepts_nested_attributes_for :image 
end 

class Image < ActiveRecord::Base 
    belongs_to :answer 
end 

Denetleyici:

def new 
    @question = Question.new 
    answer = @question.build_answer 
    image = answer.build_image 

    @case_id = params[:id] 

    render :layout => 'application', :template => '/questions/form' 
end 

def create 
    question_data = params[:question] 
    @question = Question.new(question_data) 
    if @question.save 
    ... 
end 

Görünüm:

= form_for @question, :html => {:multipart => true} do |f| 

    = f.label :text, "Question Text:" 
    = f.text_area :text, :rows => 7 

    %br 
    %br 

    =f.fields_for :answer, do |af| 
    = af.label :body, "Answer Text:" 
    = af.text_area :body, :rows => 7 

    %br 
    %br 

    = f.fields_for :image do |af| 
     = af.label :title, "Image Title:" 
     = af.text_field :title 

     %br 

     = af.label :file, "Image File:" 
     = af.file_field :file 

     %br 

     = af.label :caption, "Image Caption:" 
     = af.text_area :caption, :rows => 7 

    = hidden_field_tag("case_id", value = @case_id) 

    = f.submit 

cevap

8

Sana biraz karışık form değişkenleri buldum. Olmalıdır:

= form_for @question, :html => {:multipart => true} do |f| 

    = f.label :text, "Question Text:" 
    = f.text_area :text, :rows => 7 

    %br 
    %br 

    =f.fields_for :answer, do |af| 
    = af.label :body, "Answer Text:" 
    = af.text_area :body, :rows => 7 

    %br 
    %br 

    = af.fields_for :image do |img_form| 
     = img_form.label :title, "Image Title:" 
     = img_form.text_field :title 

     %br 

     = img_form.label :file, "Image File:" 
     = img_form.file_field :file 

     %br 

     = img_form.label :caption, "Image Caption:" 
     = img_form.text_area :caption, :rows => 7 

    = hidden_field_tag("case_id", value = @case_id) 

    = f.submit 

sırayla af.fields_for ... do |img_form| çoğaltılır hangi form_for ... do |f|, f.fields_for ... do |af| çoğaltılır nasıl dikkat edin.

Anahtar, ikinci fields_for'dur. f.fields_for :image do |img_form| yerine af.fields_for :image do |img_form| olmalıdır.

+1

Teşekkürler, bu sorunu çözdünüz. Şu anda sahip olduğum tek sorun, formu gönderdiğimde, "Soru sorusu boş bırakılamaz" form hatası alıyorum. Sanırım bunun nedeni, "Cevap" ın doldurulmayabilecekmiş gibi görünen soru_adı adlı gerekli bir alana sahip olmasından kaynaklanıyor. Herhangi bir fikir? – LennonR

+2

Bu doğru. Bu gerçekleşiyor çünkü ana nesne ('Soru') yeni bir kayıttır ve bu nedenle bir alt nesne ('Cevap') kaydetmeye çalıştığınızda henüz mevcut değildir (yani bir kimliği yoktur). Doğrulamalarınızı question_id veya denetleyicinizde kaldırabilirsiniz, önce ana nesneyi ('@ question.save') sonra da çocukları ('@question.answers << @ answer') kaydedin. Bunun gibi bir şey ... Daha fazla bilgi için bu [makale] 'ya bakın (http://hobocentral.net/blog/2008/04/29/activerecord-behaviour-with-associations/). HTH – mbreining

+0

Gerçekten bunu anlayamıyor mu? Aşağıdaki Railscast'te (Rails 2.3 için de olsa), yazar basit bir @ survey.new/@ survey.save ile yapmaya çalıştığım şeyi yapar. [link] (http://railscasts.com/episodes/196-nested-model-form-part-1) Onun için Rails az önce her şeyi düzeltti ve doğru dernek yaptı. Rails 3, artık bunu halletmiyor mu? İşte projesinin github kaynak kodu: [link] (https://github.com/ryanb/railscasts-episodes/tree/master/episode-196/surveysays) Yoksa farklı bir şey mi yapıyorum? – LennonR