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ư có 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 }
Vui lòng đăng nhật ký dẫn đến 500. Điều đó sẽ hữu ích. – prasvin
nhật ký đã được đăng :) – Nobita
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