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

@DGM が言うように、コールバックが常に最後に true を返すことをお勧めします (または、コードの続行を妨げる場合は、フローのある時点で false を返します)。そうしないと、非常に奇妙なバグの原因になる可能性があります(経験から言えば:))。

false を返す if ブランチだと思います。コールバックの最後のステートメントとして true を追加するだけでうまくいくはずです。

于 2012-07-25T14:54:03.690 に答える
1

コールバックは続行するために true を返す必要があり、false は操作をキャンセルします。あなたの関数では、if 文の値が false かもしれません: self.regular_user = false ruby​​ 関数の戻り値は最後の文です。

最後に return true を追加するだけです。

于 2012-07-25T14:49:11.710 に答える