0

这是我的数据结构

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)

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

4

2 回答 2

1

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

只需在末尾添加一个 return true 即可。

于 2012-07-25T14:49:11.710 回答
1

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

我怀疑这是 if 分支返回错误。希望如果您只是添加 true 作为回调中的最后一条语句,它应该可以工作。

于 2012-07-25T14:54:03.690 回答