Accepts_nested_attributes_for子验证不起作用

时间:2013-01-16 19:09:47

标签: ruby-on-rails-3

我有一个名为Test的模型,接受了_stented_attributes_for SubTest。测试基本上具有id,并且有多个子测试与单个测试相关联。

我想验证SubTest的属性是否为数字。到目前为止,这是我的模型。

class Test < ActiveRecord::Base
 has_many :sub_tests
 accepts_nested_attributes_for :sub_tests
end

class SubTest < ActiveRecord::Base
 belongs_to :test
 validates :measurement, :numericality => true, :allow_nil => true
end

这是测试控制器

def create
     respond_to do |format|
  if @test.save
    flash.now[:notice] = "Test Created"
    format.html { redirect_to(@test) }
    format.xml  { render :xml => @test, :status => :created, :location => @test }
    format.js

  else
    flash.now[:error] = "[Error] Test Not Created Because: #{@test.errors.full_messages.join(", ")}"
    format.html { render :action => "new" }
    format.xml  { render :xml => @test.errors, :status => :unprocessable_entity }
    format.js
  end
end

结束

如果用户在sub_test的表单中输入非数字字符串,我希望控制器中的create动作抛出错误。

目前,如果我为sub_test.measurement输入非数字值,则Rails不会创建Test或SubTest对象(所需行为)。但由于某种原因,不会抛出任何错误,并且Test控制器会触发create.js.erb partial。

我得到的印象是,sub_test.measurement的数值验证应该在Test模型中实际发生,但我不确定如何编写一个测试数值的自定义验证方法。

提前致谢!

1 个答案:

答案 0 :(得分:0)

知道了。我需要在Test控制器中指定一个_error.js.erb部分。

def create
 respond_to do |format|
  if @test.save
   flash.now[:notice] = "Test Created"
   format.html { redirect_to(@test) }
   format.xml  { render :xml => @test, :status => :created, :location => @test }
   format.js

 else
  flash.now[:error] = "[Error] Test Not Created Because: #{@test.errors.full_messages.join(", ")}"
  format.html { render :action => "new" }
  format.xml  { render :xml => @test.errors, :status => :unprocessable_entity }
  format.js { render :partial => 'error' }
 end
end

在错误部分我刚刚添加了我的#messages div(因为我正在通过ajax进行表单提交。)