7

의 원인이 테이블에 가입 I가 기본적으로 교수 특정 수준 많은 주제지식을 가지고 있음을 의미하려고하는 다음과 같은 모델. 피험자는 고정되어 있으므로 새로운 과목이 생성되지 않으며 지식 조인 표를 통해 교수와 관련이 있습니다.레일 : 두 속성의 고유성은 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 

내가 얻을 것으로 예상/원하는 것 인 액티브 말 유일성 위반이 있기 때문에이 지식을 삽입 할 수 없지만 로그와 롤백에 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 

을 그리고 이것은 실제로 표시 : 이 같은 조치를 생성 예외가 대신 객체에 오류를 추가하고 내가 그 상황을 관리 할 수의 발생 이유를

Completed 500 Internal Server Error in 6ms 

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

궁금 : s를 500를 잘 작성 후 다음과 같습니다. 다음 라인이 뭘 해야하는가요?

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

500을 기록하는 로그를 게시하십시오. 도움이 될 것입니다. – prasvin

+0

로그가 게시되었습니다. – Nobita

+0

예, 오류가 개체에 추가되어 있어야합니다. 나는 그것이 500 오류를 일으키는 것이라고 생각하지 않습니다. KnowlegesController # create의'if @ knowledge.save' 줄 앞에서 디버거를 사용하거나 실행을 중단 할 수 있습니까? 그런 다음 유효성 검사 오류가'@ 지식'에 삽입되었는지 확인하기 위해'@ knowledge.save' 및'@ knowledge.save! '를 시도하십시오. 콘솔에서도 확인하실 수 있습니다. 또한 전체 스택 추적의 요지를 게시 할 수 있습니까? 나는 그것이 유일성의 유효성 확인 때문이 아니라는 강한 느낌을 가지고 있습니다. – prasvin

답변

0

그 오류는 해당 테이블에 중복 subject_id/professor_id쌍를 삽입하려고하는 것을 의미한다. subject_id 또는 professor_idnull 일 때 가장 자주 발생합니다.

컨트롤러가 올바른 매개 변수를 얻고 있습니까? 로그를 확인하여 삽입이 예상 한 것과 같은지 확인합니다.

0

나는 의견을 말할만큼 충분한 명성을 얻지 못했다. 나의 대답은 결정적인 대답보다 더 많은 시도가 필요하다.

유효성 검사 오류로 인해 저장이 실패한 것처럼 보입니다. 'else'블록에서 처리하도록 시도 할 수 있습니다. 다음은 모든 유효성 검증 오류에 대한 설명 (디버깅에 유용함)을 제공합니다.

@knowledge.errors.full_messages 

'새로운 작업'에서 어떤 현상이 보이지 않습니다. 나는 이것이 오류가 발생한 곳이라고 생각한다.

콘솔에 동일한 문제 (즉, 인증 문제)가 발생합니까?그렇다면 데이터베이스를 정리하십시오 (주의 : 모든 데이터베이스를 다시 작성하면 &이 지워집니다).

레이크 DB : 드롭 : 모든 DB는 :, 또한

준비가 아직 없으면 방지하기 위해 지식 마이그레이션에 인덱스를 추가 마이그레이션 DB : 테스트를 모든 DB를 : 생성 중복은 db에 추가됩니다. 예 :

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