7

के कारण तालिका में शामिल होने मैं निम्नलिखित मॉडल, जो मूल रूप से है कि एक प्रोफेसर एक विशेष स्तर के लिए कई विषयों की ज्ञान है मतलब की कोशिश कर रहे है। विषयों को ठीक किया गया है, इसलिए कोई नया विषय नहीं बनाया जाएगा, ज्ञान में शामिल होने के माध्यम से प्रोफेसर को "संबंधित" होगा।रेल: में दो विशेषताओं की विशिष्टता 500 त्रुटि

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 

मैं एक रूप है कि उसके खाते में एक विषय जोड़ने के लिए एक प्रोफेसर दूँगी करना चाहते हैं, और मैं एक ज्ञान के लिए एक फार्म का फैसला किया है (जैसा कि मैं भी एक स्तर सम्मिलित करने के लिए सक्षम होना चाहते हैं)।

यह इस तरह दिखता है:

<%= 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 %> 

और में मनोरोग नियंत्रक के कार्रवाई बनाने मैं इस है:

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

मुझे पसंद/प्राप्त करने के लिए उम्मीद करेंगे एक ActiveRecord कह कि इस ज्ञान को सम्मिलित नहीं किया जा सकता है क्योंकि एक विशिष्टता उल्लंघन है, लेकिन नप्स, मैं सिर्फ 500 में लॉग और रोलबैक देखता हूं, लेकिन ऐसा लगता है कि निष्पादन जारी है। तो मेरा सवाल है: मैं गलत क्या कर रहा हूं, या मैं इस मॉडलिंग की स्थिति में कैसे सुधार कर सकता हूं? मेरा मानना ​​है कि फ़ॉर्म को शामिल मॉडल से संबंधित होना चाहिए क्योंकि मैं उस मॉडल के फ़ील्ड रखना चाहता हूं ... लेकिन शायद मैं गलत हूं, और मैं एक आसान/साफ तरीके से कर सकता हूं।

संपादित:

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 

मैं कुछ शर्तों कहा:

के रूप में टिप्पणियों में से एक में पूछा, यहां प्रपत्र जमा करने के लॉग और 500 त्रुटि सही रोलबैक के बाद है में कार्रवाई बनाने के लिए, इस तरह:

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 

और यह वास्तव में दिखाई रों निम्नलिखित सही होने के बाद 500:

Completed 500 Internal Server Error in 6ms 

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

मुझे आश्चर्य है कि क्यों अपवाद के बजाय सिर्फ वस्तु में त्रुटियों को जोड़ने और मुझे उस स्थिति का प्रबंधन करते हैं की बढ़ाई जाती है। क्या निम्न पंक्ति क्या नहीं करनी चाहिए?

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

कृपया लॉग इन करें जो 500 की ओर बढ़ते हैं। यह सहायक होगा। – prasvin

+0

लॉग पोस्ट किए गए हैं :) – Nobita

+0

हां, ऑब्जेक्ट में त्रुटियों को जोड़ा जाना चाहिए था। मुझे नहीं लगता कि 500 ​​त्रुटि हो रही है। क्या आप डीबगर या प्राइ का उपयोग करके, KnowledgesController # बनाने में 'if @ knowledge.save' लाइन' से पहले निष्पादन रोक सकते हैं। फिर '@ knowledge.save' और' @ knowledge.save! 'को आज़माएं ताकि पुष्टि हो सके कि सत्यापन त्रुटियों को' @ ज्ञान 'में एम्बेड किया गया है। आप कंसोल से भी सत्यापित कर सकते हैं। इसके अलावा, क्या आप पूरे स्टैक ट्रेस का एक गिस्ट पोस्ट कर सकते हैं। मुझे एक मजबूत भावना है कि यह विशिष्टता को मान्य करने के कारण नहीं है। – prasvin

उत्तर

0

कि त्रुटि का अर्थ है कि आप उस मेज पर डुप्लिकेट subject_id/professor_id जोड़े सम्मिलित करने के लिए कोशिश कर रहे हैं। अक्सर होता है जब subject_id या professor_idnull है।

क्या आप सुनिश्चित हैं कि नियंत्रक सही पैरामीटर प्राप्त कर रहा है? मैं यह सुनिश्चित करने के लिए लॉग जांचता हूं कि आवेषण आप क्या चाहते हैं।

0

मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है ... मेरा उत्तर एक निश्चित उत्तर से क्षमा करने के लिए कुछ और चीजें हैं, क्षमा करें।

ऐसा लगता है कि सत्यापन त्रुटियों के कारण सहेजने में विफल रहा है। आप अपने 'अन्य' ब्लॉक में उनको संभालने का प्रयास कर सकते हैं। निम्नलिखित आपको सभी सत्यापन त्रुटियों का विवरण देगा (डीबगिंग के लिए उपयोगी)।

@knowledge.errors.full_messages 

आपने यह नहीं दिखाया है कि 'नई' कार्रवाई में क्या हो रहा है। मुझे संदेह है कि यह वह जगह है जहां त्रुटियां हो रही हैं।

क्या एक ही समस्या कंसोल में (यानी सत्यापन समस्या) होती है?यदि ऐसा है, तो अपने डेटाबेस को साफ़ करने का प्रयास करें (सावधान रहें - निम्नलिखित & आपके सभी डेटाबेस पुनर्निर्माण मिटा देंगे)।

रेक db: ड्रॉप: सभी db: बनाने के लिए: सभी db: विस्थापित db: परीक्षण:

भी तैयार है, यदि आप नहीं पहले से ही है, को रोकने के लिए ज्ञान के लिए अपने प्रवास के एक सूचकांक जोड़ने डुप्लिकेट डीबी में जोड़ा जा रहा है। जैसे

add_index :knowledges, [ :professor_id, :subject_id ], unique: true 
संबंधित मुद्दे