【问题标题】:Rails 5.1.4 - creating a user from a seed file works locally but fails in Heroku productionRails 5.1.4 - 从种子文件创建用户在本地工作,但在 Heroku 生产中失败
【发布时间】: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


【解决方案1】:

感谢@Rockwell Rice 的 cmets,我使用了 sa.save!看看发生了什么。

检查密码复杂性的自定义方法出现验证错误。此方法已在本地更改但未部署到生产环境,因此保存用户失败的原因。

DOH!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 2021-12-08
    • 2016-01-14
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多