这是我的数据结构
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
答案 0 :(得分:1)
回调需要返回true才能继续,false取消操作。在您的函数中,if语句的值可能为false:self.regular_user = false
ruby函数的返回值是最后一个语句。
只需在最后添加一个返回true。
答案 1 :(得分:1)
正如@DGM所说,回调总是在最后返回true是好的做法(如果它们应该阻止代码继续,则在流程中的某个点处为false)。否则它可能是一些非常奇怪的错误的根源(从经验:))。
我怀疑是if分支返回false。希望如果你只是添加true作为回调中的最后一个语句它应该可以工作。