Rails has_many通过验证被跳过了

时间:2013-08-22 15:22:35

标签: ruby-on-rails ruby ruby-on-rails-3 validation activerecord

我有点愚蠢地问这个问题,但我一直在谷歌搜索我的*#off。

我有以下型号:

class Company < ActiveRecord::Base
  has_many :employments
  has_many :users, through: :employments

  validates_presence_of :name
  validates_presence_of :description
  validates_numericality_of :zip, only_integer: true
  validates_presence_of :email
  validates_presence_of :street
  validates_presence_of :city
  validates_presence_of :country
  validates_presence_of :telephone
end

class Employment < ActiveRecord::Base
  belongs_to :user
  belongs_to :company
end

class User < ActiveRecord::Base
  has_many :employments
  has_many :companies, through: :employments
end

重要的是公司模型有一些验证。

现在,我有以下控制器来创建一个新公司:

class CompaniesController < ApplicationController
  def create
    @company = Company.new(company_params) # The params were set with a private Method
    @employment = @company.employments.build(user: current_user, is_admin: true)
    if @employment.save
      redirect_to :back, flash: { success: 'Success' }
    else
      @title = 'Create a new company'
      render :new
    end
  end
end

问题是,当我离开公司 - 字段空白时,公司没有被创建,但就业模型在数据库中得到了持久性。

我相信它与Company.new()有关 - 如果在创建@ employment-Model之前首先创建@ company-Model,我必须检查。

如何实现首先测试验证?

非常感谢!

2 个答案:

答案 0 :(得分:2)

要验证关联对象,您需要使用validates_associated。请注意链接的api文档中的“警告”和“注释”。

尝试:

class Employment < ActiveRecord::Base
  belongs_to :user
  belongs_to :company

  validates_associated :company
end

答案 1 :(得分:1)

除了v​​inodadhikary的回答,您还可以尝试保存公司。因此,请使用@employment.save而不是@company.save。当@employment通过验证时,这也应该保存@company