【发布时间】:2020-11-03 14:22:41
【问题描述】:
我有一个种子文件来创建“root/sysadmin”用户。它适用于本地,也适用于本地的其他开发者。
但是当我们在heroku上运行它时,它失败了:
cat seed_sa.rb | heroku run rails console --no-tty
这是我在日志中看到的:
sa = User.new(
email: 'mickey@mouse.com',
nickname: 'sysadmin',
name: 'Mickey Mouse',
password: ‘testing2020!’,
is_onboarded: true,
role: User.roles[:admin],
confirmed_at: DateTime.now,
retailer_id: @retailer.id
)
D, [2020-11-03T13:51:41.529625 #4] DEBUG -- : Retailer Load (1.2ms) SELECT "retailers".* FROM "retailers" WHERE "retailers"."id" = $1 LIMIT $2 [["id", "4d696e0f-7c63-44e1-9521-d75da2debd7e"], ["LIMIT", 1]]
#<User id: nil, retailer_id: "4d696e0f-7c63-44e1-9521-d75da2debd7e", provider: "email", uid: "", allow_password_change: false, name: "Mickey Mouse", nickname: "sysadmin", image: nil, email: "mickey@mouse.com", created_at: nil, updated_at: nil, role: "admin", is_onboarded: true>
sa.save
D, [2020-11-03T13:51:41.532197 #4] DEBUG -- : (1.0ms) BEGIN
D, [2020-11-03T13:51:41.541785 #4] DEBUG -- : User Exists (1.2ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 LIMIT $2 [["email", "mickey@mouse.com"], ["LIMIT", 1]]
D, [2020-11-03T13:51:41.543825 #4] DEBUG -- : User Exists (1.2ms) SELECT 1 AS one FROM "users" WHERE "users"."email" = $1 AND "users"."provider" = $2 LIMIT $3 [["email", "mickey@mouse.com"], ["provider", "email"], ["LIMIT", 1]]
D, [2020-11-03T13:51:41.545052 #4] DEBUG -- : (1.0ms) ROLLBACK
false
我已经删除了数据库,重新创建了它(运行所有迁移),重新启动了 Heroku。但它总是无法创建该用户......但不是在本地?!
这是用户模型:
class User < ActiveRecord::Base
# Relationships
belongs_to :retailer
has_many :customers, foreign_key: :created_by
enum role: {admin: 0, owner: 1, user: 2}
# Validations
validates_presence_of :password, on: :create
validates_uniqueness_of :email, allow_nil: false
# Hooks
after_initialize :create_retailer, if: :new_record?
# Include default devise modules. Others available are:
# :lockable, :timeoutable, :omniauthable
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable
include DeviseTokenAuth::Concerns::User
def token_validation_response
UserSerializer.new(self, root: false).as_json(include: '**')
end
def as_json(options={})
# see https://stackoverflow.com/questions/17730121/include-associated-model-when-rendering-json-in-rails
super(include: [:retailer])
end
def inviter_name
inviter = User.find(self.invited_by_id)
inviter.name || "Someone"
end
def reassign_proposals_to(user)
proposals = Proposal.where('created_by = ?', self.id)
proposals.each do |proposal|
proposal.created_by = user.id
proposal.updated_by = '(deleted user)'
proposal.save
end
end
private
def create_retailer
# When a new user is created (via registration) we auto-create their account
# using ||= to ensure users created other ways (eg. seeding, invitation) do not also
# result in a new account being created
self.retailer ||= Retailer.new(name: 'New Account')
self.role ||= User.roles[:owner]
end
【问题讨论】:
-
表示用户存在。在运行此之前,您是否查询过数据库以查看该用户是否在其中?也许它试图重用该电子邮件的种子代码有问题?以太方式错误很明显用户已经存在,你能在运行之前验证它确实不存在吗?
-
我已经验证它不存在,通过进入 Rails 控制台并执行 User.count -> 返回 0
-
如果你使用
sa.save!,你可能会得到更多关于到底发生了什么的信息,但这个错误似乎不这样认为。之前运行的种子文件中是否在此之上创建了任何内容? -
你是救生员@RockwellRice,做到了。我从代码中删除了一种验证方法,但忘记将新代码部署到 Heroku! GRRR
-
没关系,您可以继续输入答案。格莱德你明白了
标签: ruby-on-rails heroku