2012-06-30 29 views
7

tôi có các mô hình sau đây, mà về cơ bản đang cố gắng có nghĩa là một giáo sư kiến ​​thức của nhiều đối tượng cho một cụ thể mức. Các đối tượng được cố định, do đó sẽ không có đối tượng mới được tạo ra, sẽ chỉ có "liên quan" với giáo sư thông qua bảng tham gia kiến ​​thức.Rails: Tính độc đáo của hai thuộc tính trong cùng bảng gây 500 lỗi

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 

Tôi muốn có một hình thức mà sẽ cho phép một giáo sư để thêm một đối tượng vào tài khoản của mình, và tôi quyết định có một hình thức cho một sự hiểu biết (như tôi muốn để có thể chèn một mức quá).

Nó trông như thế này:

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

Và trong tạo hoạt động của bộ điều khiển kiến ​​thức tôi có điều này:

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

Tôi muốn/mong đợi để có được một ActiveRecord nói rằng kiến ​​thức này không thể được chèn bởi vì có một sự vi phạm độc đáo, nhưng nops, tôi chỉ nhìn thấy 500 trong các bản ghi và một rollback, nhưng có vẻ như việc thực hiện tiếp tục. Vì vậy, câu hỏi của tôi là: Tôi đang làm gì sai, hoặc làm thế nào tôi có thể cải thiện tình hình mô hình này? Tôi tin rằng các hình thức cần phải được liên quan đến mô hình tham gia như tôi muốn có các lĩnh vực của mô hình trên đó ... Nhưng có lẽ tôi sai, và tôi có thể làm một cách dễ dàng/sạch hơn.

EDIT:

Như hỏi tại một trong những ý kiến, đây là nhật ký của việc nộp đơn và 500 lỗi ngay sau khi rollback:

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 

tôi đã thêm một số điều kiện trong tạo hành động, như thế này:

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 

Và điều này thực sự hiển thị s sau đây ngay sau 500:

Completed 500 Internal Server Error in 6ms 

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

Tôi tự hỏi tại sao ngoại lệ được nêu ra thay vì chỉ thêm lỗi vào đối tượng và để tôi quản lý tình huống đó. Không phải những gì dòng sau nên làm?

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

Vui lòng đăng nhật ký dẫn đến 500. Điều đó sẽ hữu ích. – prasvin

+0

nhật ký đã được đăng :) – Nobita

+0

Có, các lỗi nên được thêm vào đối tượng. Tôi không nghĩ rằng đó là gây ra lỗi 500. Bạn có thể tạm dừng việc thực hiện trước khi 'if @ knowledge.save' dòng trong KnowledgesController # tạo, sử dụng trình gỡ rối hoặc nâng lên. Sau đó thử '@ knowledge.save' và' @ knowledge.save! 'Chỉ để xác nhận các lỗi xác thực đã được nhúng vào' @ knowledge'. Bạn có thể xác minh rằng ngay cả từ giao diện điều khiển. Ngoài ra, bạn có thể vui lòng đăng ý chính của toàn bộ dấu vết ngăn xếp hay không. Tôi có cảm giác mạnh mẽ rằng đây không phải là do tính hợp lệ duy nhất. – prasvin

Trả lời

0

Lỗi đó có nghĩa là bạn đang cố gắng chèn các cặp trùng lặp subject_id/professor_id trên bàn đó. Thường xảy ra nhất khi một trong các số subject_id hoặc professor_idnull.

Bạn có chắc là bộ điều khiển nhận được thông số chính xác không? Tôi sẽ kiểm tra các bản ghi để đảm bảo chèn là những gì bạn mong đợi.

0

Tôi không có đủ danh tiếng để nhận xét ... câu trả lời của tôi là nhiều thứ để thử hơn là câu trả lời dứt khoát, xin lỗi.

Dường như lưu không thành công do lỗi xác thực. Bạn có thể thử xử lý chúng trong khối 'khác' của bạn. Sau đây sẽ cung cấp cho bạn một mô tả về tất cả các lỗi xác nhận (hữu ích để gỡ lỗi).

@knowledge.errors.full_messages 

Bạn chưa thể hiện những gì đang diễn ra trong hành động 'mới'. Tôi nghi ngờ đây là nơi xảy ra lỗi.

Có vấn đề tương tự xảy ra (tức là vấn đề xác thực) trong bảng điều khiển không?Nếu vậy, hãy thử làm sạch cơ sở dữ liệu của bạn (hãy cẩn thận - sau đây sẽ xóa & xây dựng lại tất cả cơ sở dữ liệu của bạn).

rake db: thả: tất cả db: tạo: tất cả db: di chuyển db: kiểm tra: chuẩn bị

Ngoài ra, nếu bạn chưa có, thêm một chỉ số để chuyển đổi của bạn cho kiến ​​thức để ngăn chặn các bản sao được thêm vào db. ví dụ.

Các vấn đề liên quan