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 }
Lütfen, 500'e neden olan günlükleri gönderin. Bu yararlı olur. – prasvin
günlükleri gönderilmiştir :) – Nobita
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