Rails: гем Rolify не обновляет базу данных

Итак, вот что я сделал:

Выберите пользователя:

>> user = User.find(337633)
  User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 337633], ["LIMIT", 1]]
#<User id: 337633, name: "Restaurant Guy", email: "[email protected]", mobile: "8000088888", image: "", password_digest: "$2a$10$H3TlQT1DdGOPQjSR7b1st.SVvAg5XiFidrfqzyqz0RW...", created_at: "2017-02-23 18:19:29", updated_at: "2017-02-23 18:21:43", uid: nil, provider: nil, verified_at: nil, location_id: nil>

Проверить количество ролей:

>> user.roles.length
  Role Load (1.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1  [["user_id", 337633]]
1   #customer role

Предоставьте выбранному пользователю роль на конкретном ресурсе:

>> user.grant :restaurant_admin, Restaurant.first
  Restaurant Load (1.0ms)  SELECT  "restaurants".* FROM "restaurants" ORDER BY "restaurants"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Role Load (0.0ms)  SELECT  "roles".* FROM "roles" WHERE "roles"."name" = $1 AND "roles"."resource_type" = $2 AND "roles"."resource_id" = $3 ORDER BY "roles"."id" ASC LIMIT $4  [["name", "restaurant_admin"], ["resource_type", "Restaurant"], ["resource_id", 1], ["LIMIT", 1]]
   (1.0ms)  BEGIN
   (0.0ms)  ROLLBACK
  HABTM_Roles Load (0.0ms)  SELECT "users_roles".* FROM "users_roles" WHERE "users_roles"."user_id" = $1  [["user_id", 337633]]
  Role Load (0.0ms)  SELECT  "roles".* FROM "roles" WHERE "roles"."id" = $1 LIMIT $2  [["id", 4], ["LIMIT", 1]]
#<Role id: nil, name: "restaurant_admin", resource_type: "Restaurant", resource_id: 1, created_at: nil, updated_at: nil>
  Role Load (0.0ms)  SELECT "roles".* FROM "roles" WHERE "roles"."id" = 4
>> user.save
   (0.0ms)  BEGIN
true
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."mobile" = $1 AND ("users"."id" != $2) LIMIT $3  [["mobile", "8000088888"], ["id", 337633], ["LIMIT", 1]]
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 AND ("users"."id" != $2) LIMIT $3  [["email", "[email protected]"], ["id", 337633], ["LIMIT", 1]]
   (1.0ms)  COMMIT

И сохраните его:

>> user.save
   (0.0ms)  BEGIN
true
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."mobile" = $1 AND ("users"."id" != $2) LIMIT $3  [["mobile", "8000088888"], ["id", 337633], ["LIMIT", 1]]
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 AND ("users"."id" != $2) LIMIT $3  [["email", "[email protected]"], ["id", 337633], ["LIMIT", 1]]
   (1.0ms)  COMMIT

Перезагрузить из базы данных:

>> reload!
Reloading...
true

Проверьте, присутствует ли сохраненное значение

>> user = User.find(337633)
  User Load (1.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 337633], ["LIMIT", 1]]
#<User id: 337633, name: "Restaurant Guy", email: "[email protected]", mobile: "8000088888", image: "", password_digest: "$2a$10$H3TlQT1DdGOPQjSR7b1st.SVvAg5XiFidrfqzyqz0RW...", created_at: "2017-02-23 18:19:29", updated_at: "2017-02-23 18:21:43", uid: nil, provider: nil, verified_at: nil, location_id: nil>
>> user.roles.length
  Role Load (0.0ms)  SELECT "roles".* FROM "roles" INNER JOIN "users_roles" ON "roles"."id" = "users_roles"."role_id" WHERE "users_roles"."user_id" = $1  [["user_id", 337633]]
1  #customer role :(

Почему обновление не сохранилось?

Что я делаю неправильно?


ОБНОВЛЕНИЕ: похоже, что при сохранении обновленных частей нет ошибки, но, похоже, это ошибка в rolify геме при работе с Rails 5+


ОБНОВЛЕНИЕ 2: я полагаю, что вышеупомянутая ошибка была решена, и я, наконец, нашел причину, из-за которой ROLLBACK -> сбой включить ресурсы.


person Saravanabalagi Ramachandran    schedule 24.02.2017    source источник
comment
я должен сделать save на ролях? что-то вроде user.roles.save для обновления массива ролей?   -  person Saravanabalagi Ramachandran    schedule 24.02.2017
comment
что делает ROLLBACK, когда я предоставил роль? это вызывает ошибку?   -  person Saravanabalagi Ramachandran    schedule 24.02.2017


Ответы (3)


Необходимо включить resourcify в ресурс, который должен быть назначен роли, а ROLLBACK происходило, когда ссылка была разорвана.

И я также обнаружил, что user.save здесь бесполезен, так как роли попадают в БД сразу после того, как вы их предоставляете

person Saravanabalagi Ramachandran    schedule 24.02.2017

На основе этого SO answer попробуйте напрямую вызвать перезагрузку объекта пользователя:

user.reload

Кажется, что консоль рельсов не перезагружает классы после ссылки на них.

person Flip    schedule 24.02.2017
comment
reload не помогает! :( Роли не обновляются. Может ли это быть причиной ROLLBACK? - person Saravanabalagi Ramachandran; 24.02.2017
comment
и кстати, даже если user obj кэшируется и не сбрасывается во время reload!, rails должен получить его из базы данных по моей команде user = User.find(id) что я сделал после reload! правильно? - person Saravanabalagi Ramachandran; 24.02.2017
comment
истинный. Вы можете опубликовать метод grant? - person Flip; 24.02.2017
comment
это псевдоним метода add_role в rolify gem. Подробности здесь - person Saravanabalagi Ramachandran; 24.02.2017
comment
Вы пробовали методы add_role и has_role драгоценного камня? как ты настроил БД? - person Flip; 24.02.2017
comment
да, grant работает точно как add_role, а user.has_role? :customer возвращает true. Драгоценный камень вероятно работает нормально - person Saravanabalagi Ramachandran; 24.02.2017

Когда вы предоставляете выбранному пользователю роль на определенном ресурсе, создается впечатление, что в users_roles не добавляется запись.

>> user.grant :restaurant_admin, Restaurant.first
  Restaurant Load (1.0ms)  SELECT  "restaurants".* FROM "restaurants" ORDER BY "restaurants"."id" ASC LIMIT $1  [["LIMIT", 1]]
  Role Load (0.0ms)  SELECT  "roles".* FROM "roles" WHERE "roles"."name" = $1 AND "roles"."resource_type" = $2 AND "roles"."resource_id" = $3 ORDER BY "roles"."id" ASC LIMIT $4  [["name", "restaurant_admin"], ["resource_type", "Restaurant"], ["resource_id", 1], ["LIMIT", 1]]
   (1.0ms)  BEGIN
   (0.0ms)  ROLLBACK
  HABTM_Roles Load (0.0ms)  SELECT "users_roles".* FROM "users_roles" WHERE "users_roles"."user_id" = $1  [["user_id", 337633]]
  Role Load (0.0ms)  SELECT  "roles".* FROM "roles" WHERE "roles"."id" = $1 LIMIT $2  [["id", 4], ["LIMIT", 1]]
#<Role id: nil, name: "restaurant_admin", resource_type: "Restaurant", resource_id: 1, created_at: nil, updated_at: nil>
  Role Load (0.0ms)  SELECT "roles".* FROM "roles" WHERE "roles"."id" = 4
>> user.save
   (0.0ms)  BEGIN
true
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."mobile" = $1 AND ("users"."id" != $2) LIMIT $3  [["mobile", "8000088888"], ["id", 337633], ["LIMIT", 1]]
  User Exists (1.0ms)  SELECT  1 AS one FROM "users" WHERE "users"."email" = $1 AND ("users"."id" != $2) LIMIT $3  [["email", "[email protected]"], ["id", 337633], ["LIMIT", 1]]
   (1.0ms)  COMMIT

это было ОТМЕНЕНО. поэтому я думаю, что что-то не так с методом user#grant

person silentfox    schedule 24.02.2017
comment
так что, возможно, это серьезная ошибка в rolify драгоценном камне? - person Saravanabalagi Ramachandran; 24.02.2017
comment
я не думаю, что это не ошибка, но вы должны проверить, возвращает ли это значение, отличное от нуля Role.where(name: 'restaurant_admin', resource_type: 'Restaurant', resource_id: 1) - person silentfox; 24.02.2017
comment
такой записи не было, пока я не добавил resourcify, а затем не выполнил команду grant; Это ошибка в том смысле, что она не показывает ошибку что resourcify отсутствует или говорит о том, что rel не работает - person Saravanabalagi Ramachandran; 24.02.2017