5

変ですね。Rails 3.2 アプリで Rolify + CanCan + Devise を使用しています。私のユースケースは単純です。ユーザーが一度に 1 つの役割だけを持つようにしたいので、役割を変更するには、次のようにします。

user.remove_role "admin"
user.add_role "associate"

私にとって奇妙なことは、これを行うと、役割「管理者」が役割テーブルから削除されることです。これはなぜでしょうか?役割を完全に排除したくはありません。ユーザーから特定の役割だけを取り除きたいのです。私は何を間違っていますか?

これがSQLです。最後の delete from roles ステートメントに注意してください。

3] pry(main)> u.remove_role "sub_admin"
  Role Load (0.1ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = 2 AND "roles"."name" = 'sub_admin'
   (0.0ms)  begin transaction
   (0.3ms)  DELETE FROM "users_roles" WHERE "users_roles"."user_id" = 2 AND "users_roles"."role_id" IN (2)
   (1.9ms)  commit transaction
  User Load (0.1ms)  SELECT "users".* FROM "users" INNER JOIN "users_roles" ON "users"."id" = "users_roles"."user_id" WHERE "users_roles"."role_id" = 2
   (0.0ms)  begin transaction
  SQL (2.1ms)  DELETE FROM "roles" WHERE "roles"."id" = ?  [["id", 2]]
   (0.6ms)  commit transaction
4

4 に答える 4

2

私はこの質問が2年以上前のものであることを知っていますが、より良い、より多くの「ロリファイのような」答えを見つけました.
User モデルでは非常に簡単に実行できます。

def remove_only_role_relation(role_name)
    roles.delete(roles.where(:name => role_name))
end

次のように使用します。

@user = User.find_by_id(params[:id])
role_name = params[:role_name]
# or:
# role_name = Role.find_by_id(params[:role_id]).name rescue nil
if @user and role_name
    @user.remove_only_role_relation(role_name)
end

ソースで同様のコードを見つけました:
rolyfi: role.rb - ここではメソッド remove_role cals メソッド "remove" をアダプター ファイルに挿入します:

于 2015-11-27T11:22:51.930 に答える
0

に行くconfig/initializers/rolify.rb

この行のコメントを外します

  config.remove_role_if_empty = false 

したがって、ファイルは次のようになります。

Rolify.configure do |config|
  
  # Configuration to remove roles from database once the last resource is removed. Default is: true
  config.remove_role_if_empty = false
end

デフォルトでは、remove_role_if_empty が設定されてtrueおり、ロールが他のユーザーに割り当てられていない場合、rolify はロールを削除します。

于 2021-02-19T17:46:21.263 に答える