के कारण तालिका में शामिल होने मैं निम्नलिखित मॉडल, जो मूल रूप से है कि एक प्रोफेसर एक विशेष स्तर के लिए कई विषयों की ज्ञान है मतलब की कोशिश कर रहे है। विषयों को ठीक किया गया है, इसलिए कोई नया विषय नहीं बनाया जाएगा, ज्ञान में शामिल होने के माध्यम से प्रोफेसर को "संबंधित" होगा।रेल: में दो विशेषताओं की विशिष्टता 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 }
कृपया लॉग इन करें जो 500 की ओर बढ़ते हैं। यह सहायक होगा। – prasvin
लॉग पोस्ट किए गए हैं :) – Nobita
हां, ऑब्जेक्ट में त्रुटियों को जोड़ा जाना चाहिए था। मुझे नहीं लगता कि 500 त्रुटि हो रही है। क्या आप डीबगर या प्राइ का उपयोग करके, KnowledgesController # बनाने में 'if @ knowledge.save' लाइन' से पहले निष्पादन रोक सकते हैं। फिर '@ knowledge.save' और' @ knowledge.save! 'को आज़माएं ताकि पुष्टि हो सके कि सत्यापन त्रुटियों को' @ ज्ञान 'में एम्बेड किया गया है। आप कंसोल से भी सत्यापित कर सकते हैं। इसके अलावा, क्या आप पूरे स्टैक ट्रेस का एक गिस्ट पोस्ट कर सकते हैं। मुझे एक मजबूत भावना है कि यह विशिष्टता को मान्य करने के कारण नहीं है। – prasvin