#ruby-on-rails
#ruby-on-rails
Вопрос:
У меня очень сложная проблема с кодом проверки в моем приложении.
У меня есть пользователь и талант. У пользователя есть_один талант. И, в зависимости от шагов приложения, мне нужно проверить некоторые случаи.
Это мои классы.
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 amp;amp; 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 для талантов вызываются в процессе загрузки класса, но не при создании нового?
Ответ №1:
Первая странная вещь. Ошибка byebug в середине with_options вызывается при запуске сервера или когда я запускаю консоль rails.
with_options
вычисляется при загрузке класса, вот почему byebug останавливает выполнение только в эти моменты. Вот как это работает.
Я не совсем уверен, что вы хотите делать с этими byebug
вызовами, но я думаю, что вы хотите добавить их в процедуры, этот код фактически оценивается в данный момент с текущим экземпляром.
with_options if: Proc.new { |t| byebug; t.user.approval_submission_step >= 2 } do |t|