为什么前置过滤器给我一个错误

时间:2012-07-25 14:46:16

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

这是我的数据结构

class User < ActiveRecord::Base
  has_many :companies, :through => :positions
  has_many :positions

class Company < ActiveRecord::Base
  has_many :positions
  has_many :users, :through => :positions

class Position < ActiveRecord::Base
  belongs_to :company
  belongs_to :user
  attr_accessible :company_id, :user_id, :regular_user
end

class Position < ActiveRecord::Base
  belongs_to :company
  belongs_to :user
  attr_accessible :company_id, :user_id, :regular_user
  before_save :set_regular_user

  def set_regular_user
    if self.user.is_admin?
      self.regular_user = false
    else
      self.regular_user = true
    end
  end
end

每次我跑

@user.companies << Company.last

我得到ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved

但是如果我删除了我之前的过滤器,那么它就会完美无缺,并且可以按预期保存

 @user.companies << Company.last
     Company Load (0.2ms)  SELECT `companies`.* FROM `companies` ORDER BY `companies`.`id` DESC LIMIT 1
      (0.1ms)  BEGIN
     SQL (0.2ms)  INSERT INTO `positions` (`company_id`, `created_at`, `regular_user`, `updated_at`, `user_id`)
      VALUES 
      (263, '2012-07-25 14:44:15', NULL, '2012-07-25 14:44:15', 757)

我想念的任何想法......这个问题是基于早先的question

2 个答案:

答案 0 :(得分:1)

回调需要返回true才能继续,false取消操作。在您的函数中,if语句的值可能为false:self.regular_user = false ruby​​函数的返回值是最后一个语句。

只需在最后添加一个返回true。

答案 1 :(得分:1)

正如@DGM所说,回调总是在最后返回true是好的做法(如果它们应该阻止代码继续,则在流程中的某个点处为false)。否则它可能是一些非常奇怪的错误的根源(从经验:))。

我怀疑是if分支返回false。希望如果你只是添加true作为回调中的最后一个语句它应该可以工作。