Жизненный цикл with_options в Rails.Почему не работает? - PullRequest
0 голосов
/ 29 марта 2019

У меня очень сложная проблема с кодом проверки в моем приложении.

У меня есть пользователь и талант.У пользователя есть талант.И, в зависимости от шагов приложения, мне нужно проверить некоторые случаи.

Это мои занятия.

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

Первая странная вещь.Byebug в середине with_options вызывается, когда запускается сервер или когда я делаю консоль rails.

Когда я создаю нового пользователя и сохраняю его (используя функцию обратного вызова after_create пользователя)

 t = Talent.create(user: self)

Byebug не вызывается.

Что я делаю не так?Почему with_options для Talents вызывается в процессе загрузки классов, а не при создании нового?

1 Ответ

1 голос
/ 29 марта 2019

Первая странная вещь. Byebug в середине with_options вызывается при запуске сервера или когда я запускаю консоль rails.

with_options оценивается при загрузке класса, поэтому byebug останавливает исключение только в эти моменты. Вот как это работает.

Я не совсем уверен, что вы хотите делать с этими byebug вызовами, но я думаю, что вы хотите добавить их в Proc, этот код фактически оценивается в данный момент с текущим экземпляром.

with_options if: Proc.new { |t| byebug; t.user.approval_submission_step >= 2 } do |t|
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...