Rails中with_options的生命周期。为什么不工作?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails中with_options的生命周期。为什么不工作?相关的知识,希望对你有一定的参考价值。

我在我的应用程序上的验证代码有一个非常棘手的问题。

我有一个用户和一个人才。用户有一个人才。而且,根据应用程序的步骤,我需要验证一些情况。

那些是我的课程。

class User < ApplicationRecord
  has_one :talent, dependent: :destroy
  has_one :client, dependent: :destroy
  has_one :agency, dependent: :destroy
  before_create :set_initial_step
  after_create :build_type

  def build_type
    logger.debug("Im inside build_type ***************** with #{type}")

    if type.nil?
      t = Talent.create(user: self)
      Rails.logger.debug("checking errors ******#{type}*********** with #{t.errors.full_messages}")
    else
      o = Object.const_get(type.capitalize).create(user: self)
      Rails.logger.debug("Im inside build_type ****#{type}************* with #{o.errors.full_messages}")
    end
  end

class Talent < ApplicationRecord

with_options if: Proc.new { |t| t.user.approval_submission_step >= 2 } do |t|
byebug
t.validates :talent_type_id,
  :rate,
  presence: true
t.validates :rate, numericality: { greater_than_or_equal_to: 25 }
 end

  with_options if: Proc.new { |t| t.user.approval_submission_step >= 3 && t.talent_type.is_model } do |t|

t.validates :gender,
  :ethnicity,
  :height_feet,
  :height_inches,
  :weight,
  :eye_color,
  :hair_color,
  presence: true
t.validates :men_pant_size_waist,
  :men_pant_size_length,
  :men_shirt,
  :men_dress_shirt_size,
  :men_dress_shirt_neck,
  :men_dress_shirt_sleeve,
  :men_jacket,
  :men_shoe_size,
  presence: true, if: Proc.new { |t| t.gender == 'male' }
t.validates :ethnicity,
            :inclusion => {in: VALID_ETHNICITY_TYPES}
t.validates :womens_dress_size,
  :women_shoe_size,
  :women_shirt,
  :womens_dress_size,
  :women_pant,
  :women_bra_cup,
  :women_bra_size,
  presence: true, if: Proc.new { |t| t.gender == 'female' }
 end

第一个奇怪的事情。在服务器启动或我执行rails控制台时调用with_options中间的byebug。

当我创建一个新用户并保存它时(使用用户的回调after_create)

 t = Talent.create(user: self)

它的名字叫做byebug。

我做错了什么?为什么在类加载过程中调用on -options on Talents,而不是在创建新类时?

答案

第一个奇怪的事情。在服务器启动或我执行rails控制台时调用with_options中间的byebug。

加载类时会对with_options进行评估,这就是为什么byebug只会在那些时刻停止执行。这就是它的工作原理。

我不确定你想对那些byebug调用做什么,但我认为你想在Proc中添加它们,那个代码实际上是用当前实例进行评估的。

with_options if: Proc.new { |t| byebug; t.user.approval_submission_step >= 2 } do |t|

以上是关于Rails中with_options的生命周期。为什么不工作?的主要内容,如果未能解决你的问题,请参考以下文章

ClickHouse数据生命周期管理

spring生成bean对象的生命周期都有哪些种类?

C语言中,哪种存储类的作用域与生命周期是不一致的?

Unity脚本生命周期与执行顺序

React Native组件生命周期

如何将基于“使用”的 GC 生命周期打开为基于“创建-处置”的生命周期?