0

User と Role の 2 つのモデルがあります。

ロールモデル:

has_and_belongs_to_many :users 

ユーザーモデルでは、

has_and_belongs_to_many :roles 
validates_presence_of :name, :if => "roles.map(&:name).include?(\"manager\")"

私の問題は、ユーザーの役割に「マネージャー」の役割を追加できることです。私が呼び出すときのコンソールで

sampleUser.roles << managerRole

それは徹底的に進み、データベースに保存します。私が電話するとき

sampleUser.valid?

私は嘘をつきます、

私の理解では、roles_users は別のテーブルであるため、ユーザーの何も更新されないため、ユーザーの検証は使用されません。この問題を回避し、ユーザーがデータベースに行くものを有効にする方法はありますか?

4

2 に答える 2

1

おっしゃるとおり、HABTM リンクが保存されるまで、HABTM 関係を介してレコードにアクセスすることはできません。できることは、 after_save コールバックを使用して関連するレコードを検証し、検証が失敗した場合はトランザクションをロールバックすることです。

http://mattberther.com/2012/09/09/validating-habtm-relationships-with-rails-3xを参照してください。

于 2013-05-09T23:25:21.470 に答える
0

あなたは使いたいかもしれません

gem 'rolify'
gem 'cancan'

https://github.com/EppO/rolify

https://github.com/ryanb/cancan

これらの Gem を使用すると、ユーザー モデルでロールを処理するのが非常に簡単になります。

cancan の作成者である Ryan Bates は、この問題に関する素晴らしいスクリーンキャストを持っています: http://railscasts.com/episodes/192-authorization-with-cancan

于 2013-05-09T21:58:08.327 に答える