Ruby on rails 如何使第一个注册用户成为Rails应用程序的管理员?

Ruby on rails 如何使第一个注册用户成为Rails应用程序的管理员?,ruby-on-rails,Ruby On Rails,我有一个用户模型,我在Rails 5上的应用程序,我正在尝试创建一个自定义回调,允许您将admin角色分配给第一个注册用户,但不幸的是,在将数据保存到数据库时,没有分配该角色。。。请告诉我,怎么了 数据库 t.boolean "admin", default: false 模型 class用户堆栈级别太深) 您可以执行以下操作: before_create :set_admin private def set_admin self.admin = true unless User.ex

我有一个用户模型,我在Rails 5上的应用程序,我正在尝试创建一个自定义回调,允许您将admin角色分配给第一个注册用户,但不幸的是,在将数据保存到数据库时,没有分配该角色。。。请告诉我,怎么了

数据库

t.boolean "admin", default: false
模型

class用户
尝试使用

user = User.find(1)
user.admin = true
user.save
我不建议使用回调将第一个注册用户更新为管理员。您可以使用种子,因为它只需要运行一次。

尝试使用

user = User.find(1)
user.admin = true
user.save

我不建议使用回调将第一个注册用户更新为管理员。您可以使用seed,因为它只需要运行一次。

您需要在创建
回调之前使用
,该回调将
admin
设置为
true
(但不保存!它将在再次保存
回调之前触发
,以此类推=>堆栈级别太深)

您可以执行以下操作:

before_create :set_admin

private

def set_admin
  self.admin = true unless User.exists? # faster than a count
end
或者另一个版本,在保存后使用
回调:

after_create :update_admin

private

def update_admin
  self.update_attributes!(admin: true) if User.count == 1
end

这两种解决方案的缺点是,每次创建用户时,这些回调都会触发SQL计数。

您希望在创建之前有一个
回调,该回调将
admin
设置为
true
(但不保存!它会在保存之前再次触发
回调,以此类推=>堆栈级别太深)

您可以执行以下操作:

before_create :set_admin

private

def set_admin
  self.admin = true unless User.exists? # faster than a count
end
或者另一个版本,在保存后使用
回调:

after_create :update_admin

private

def update_admin
  self.update_attributes!(admin: true) if User.count == 1
end

这两种解决方案的缺点是,每次创建用户时,这些回调都会触发SQL计数。

您应该使用find方法,而不是count方法
User.find(1)。更新属性(admin:true)
。但我认为您只想在rails控制台上执行一次,而不是每次保存用户时执行一次<代码>=>#
验证是否失败?检查
user.errors.messages
以查看错误(如果
user
是第一个
update\u属性失败的用户)。您应该使用查找方法,而不是计数
User.find(1)。更新属性(admin:true)
。但我认为您只想在rails控制台上执行一次,而不是每次保存用户时执行一次<代码>=>#
验证是否失败?检查
user.errors.messages
以查看错误(如果
user
是第一个更新属性失败的用户)。非常感谢!我用了第二个选项!非常感谢你!我用了第二个选项!为了清楚起见:您应该在
rails控制台中运行它,也许您的第一个/唯一的用户没有id=1?因此,请尝试
user=user.first
,因为第一行应该可以工作。我更喜欢这种“手动方法”而不是回调,因为本质上应该是一种例外情况(例如,确保您是管理员),为了清楚起见:您应该在
rails控制台中运行它,并且您的第一个/唯一的用户可能没有id=1?因此,请尝试
user=user.first
,因为第一行应该可以工作。我更喜欢这种“手动方法”而不是回调,因为本质上应该是例外情况(例如,确保您是管理员)