2012-06-30 18 views
7

neden masaya katılmak Ben temelde profesör belirli seviyeye birçok konuların ait bilgisine olduğu anlamına çalışıyoruz aşağıdaki modeller. Konular sabittir, bu yüzden yeni bir konu yaratılmayacak, bilgi birleştirme tablosu aracılığıyla bir profesörün "ilgili" olduğu görülecektir.Raylar: iki özellikten Teklik 500 hatası

class Subject < ActiveRecord::Base 
    # Self Associations 
    has_many :subcategories, :class_name => "Subject" 
    belongs_to :category, :class_name => "Subject",:foreign_key => "parent_id" 

    # Associations 
    has_many :knowledges 
    has_many :professors, :through => :knowledges 
end 


class Professor < ActiveRecord::Base 
    # Associations 
    has_many :knowledges 
    has_many :subjects, :through => :knowledges 
    ... 
end 

class Knowledge < ActiveRecord::Base 
    # Associations 
    belongs_to :professor 
    belongs_to :subject 
    has_one :level 

    attr_accessible :subject_id, :professor_id 

    validates :subject_id, :uniqueness => { :scope => :professor_id } 
end 

Onun hesabına bir konu eklemek için bir profesöre sağlayacak bir form var istiyorum ve (ben de bir seviye eklemek mümkün istiyorum gibi) bir bilgi için bir form var karar verdi.

<%= simple_form_for @knowledge,:url => professor_knowledges_path, :html => { :class => 'form-horizontal' } do |f| %> 
    <div class="control-group select optional"> 
     <%= label_tag "Subject Type", nil, :class => "select optional control-label"%> 
     <div class="controls"> 
    <%= select_tag "Parent Subject", options_from_collection_for_select(@parent_subjects, "id", "name"), :id => "knowledge_parent_subject" %> 
     </div> 
    </div> 
    <%= f.input :subject_id, :collection => @subjects, :label => "Subject" %> 
    <%= f.input :level %> 
    <%= f.button :submit, t('add_form'),:class => 'btn-primary' %> 
<% end %> 

Ve içinde bu var geniş detaylı bilgiler kumandanın eylem oluşturmak:

Bu şuna benzer

def create 
    @knowledge = Knowledge.create(:professor_id => current_professor.id, :subject_id => params[:knowledge][:subject_id]) 
    end 

Elde bekliyoruz/istiyoruz bir ActiveRecord diyerek Bu bilginin bir teklik ihlali olduğu için eklenemediğini, ancak nops, günlüklerde 500 olduğunu ve geri dönüşü görüyorum, ancak yürütme devam ediyor gibi görünüyor. Yani sorum şu: Ne yapıyorum ya da bu modelleme durumunu nasıl geliştirebilirim? Bu modelin alan üzerinde olmasını istediğim gibi, formun birleştirme modeliyle ilişkili olması gerektiğine inanıyorum ... Ama belki yanılıyorum ve kolay/temiz bir şekilde yapabilirim.

DÜZENLEME:

Started POST "/professors/1/knowledges" for 127.0.0.1 at 2012-07-01 00:45:39 -0700 
Processing by KnowledgesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"4JVyxWnIh37kyBwLwLGTHk/znsI1c5wrJvaWjKKT5tM=", "Parent Subject"=>"1", "knowledge"=>{"subject_id"=>"1"}, "commit"=>"Añadir", "professor_id"=>"1"} 
    Professor Load (0.4ms) SELECT `professors`.* FROM `professors` WHERE `professors`.`id` = 1 LIMIT 1 
Completed 500 Internal Server Error in 4ms 

Bazı koşullar eklendi:

yorumların birinde sorulan gibi

, burada sağ geri alma sonra formun teslim günlüğü ve 500 hatadır

def create 
    @knowledge = Knowledge.new(:professor_id => current_professor.id, :subject_id => params[:knowledge][:subject_id]) 
    if @knowledge.save 
     flash[:notice] = "Success..." 
     redirect_to professor_path(current_professor) 
    else 
     render :action => 'new' 
    end 
    end 

Ve bu aslında gösterir: böyle, eylem oluşturmak istisna yerine nesnesine hataları ekleme ve bana bu durumu yönetmesine izin ait yükseltilir neden

Completed 500 Internal Server Error in 6ms 

ActiveRecord::RecordInvalid (Validation failed: Subject has already been taken): 

acaba: 500 hemen sonra aşağıdaki. Aşağıdaki satırın yapması gereken şey değil mi?

validates :subject_id, :uniqueness => { :scope => :professor_id } 
+0

Lütfen, 500'e neden olan günlükleri gönderin. Bu yararlı olur. – prasvin

+0

günlükleri gönderilmiştir :) – Nobita

+0

Evet, hatalar nesneye eklenmelidir. Bunun 500 hataya neden olduğunu sanmıyorum. Bilginize "BilgisimController # oluştur" da @ [email protected] "satırını, hata ayıklayıcısını kullanarak veya gözetlemeyi kaldırarak durdurabilirsiniz. Daha sonra, yalnızca doğrulama hatalarının '@ 'bilgisine gömüldüğünü doğrulamak için' @ knowledge.save' ve '@ knowledge.save! Bunu konsoldan bile doğrulayabilirsiniz. Ayrıca, tüm yığın izlemenin bir özetini gönderir misiniz? Bunun, benzersizliği onaylamadan kaynaklanmadığına dair güçlü bir his var. – prasvin

cevap

0

O hata o masada yinelenen subject_id/professor_id çiftleri eklemek için çalışıyoruz anlamına gelir. Çoğu zaman subject_id veya professor_idnull olduğunda oluşur.

Denetleyicinin doğru parametreleri aldığından emin misiniz? Eklemelerin beklediğiniz gibi olduğundan emin olmak için günlükleri kontrol ederim.

0

Yorum yapmak için yeterli bir saygım yok ... cevabım, kesin bir yanıttan daha çok denemesi gereken bir şey, üzgünüm.

Doğrulama hataları nedeniyle kaydetme başarısız oluyor gibi görünüyor. 'Else' bloğunuzdakilerle başa çıkmayı deneyebilirsiniz. Aşağıdakiler, tüm doğrulama hatalarının bir açıklamasını verecektir (hata ayıklama için yararlıdır).

@knowledge.errors.full_messages 

'Yeni' eylemde neler olduğunu göstermediniz. Hataların meydana geldiği yer olduğundan şüpheleniyorum.

Konsolda aynı sorun (örn. Doğrulama sorunu) oluşuyor mu?Eğer öyleyse, veritabanlarınızı temizlemeyi deneyin (dikkatli olun - aşağıdaki tüm veritabanlarınızı yeniden & silecektir).

tırmık db: Açılan: tüm db: Ayrıca

hazırlamak Eğer henüz yapmadıysanız, önlemek Bilgi için göçe bir dizin ekleyin: göç db: testi tüm db: oluşturmak db'ye eklenen çiftler. Örneğin.

add_index :knowledges, [ :professor_id, :subject_id ], unique: true