我有以下模型,这些模型基本上试图表示教授具有知识的主题特定水平即可。主题是固定的,因此不会创建新的主题,通过知识连接表只会与教授“相关”。
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 %>
在Knowledges控制器的创建操作中,我有:
def create
@knowledge = Knowledge.create(:professor_id => current_professor.id, :subject_id => params[:knowledge][:subject_id])
end
我希望/期望得到一个 ActiveRecord ,说这个知识无法插入,因为存在唯一性违规,但是nops,我只看到日志中的500并且回滚,但似乎执行还在继续。所以我的问题是:我做错了什么,或者我如何改进这种建模情况?我认为表单需要与连接模型相关,因为我想在其上设置该模型的字段......但也许我错了,我可以用简单/清洁的方式做。
修改:
正如其中一条评论中所述,这里是提交表单的日志和回滚后的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
我在创建操作中添加了一些条件,如下所示:
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 }
答案 0 :(得分:0)
我没有足够的声誉来发表评论...我的回答是更多的尝试而不是明确的答案,抱歉。
由于验证错误,保存似乎失败了。您可以尝试在“其他”块中处理这些内容。以下内容将为您提供所有验证错误的说明(对调试很有用)。
@knowledge.errors.full_messages
您尚未显示“新”操作中发生的情况。我怀疑这是发生错误的地方。
控制台中是否出现同样的问题(即验证问题)?如果是这样,请尝试清理数据库(注意 - 以下内容将擦除并重建所有数据库)。
rake db:drop:all db:create:all db:migrate db:test:prepare
此外,如果您还没有,请为您的知识迁移添加索引,以防止将重复项添加到数据库中。 e.g。
add_index :knowledges, [ :professor_id, :subject_id ], unique: true
答案 1 :(得分:0)
该错误表示您尝试在该表上插入重复的subject_id
/ professor_id
对。最常见的情况是subject_id
或professor_id
为null
。
您确定控制器正在获取正确的参数吗?我会检查日志以确保插入符合您的预期。