Насколько я могу судить, validations are suppose to run before callbacks. Тем не менее, я получаю поведение, которое предполагает иное. В частности, у меня есть:Рельсы: проверка, вызванная после before_create
class User::GroupInvitation < ActiveRecord::Base
validate :user_can_be_invited
before_create :find_or_create_membership
private
def user_can_be_invited
user_membership = User::Membership.where(:group_id => self.group_id, :user_id => self.invitee_id).first
if user_membership.present?
case user_membership.status
when "invited"
errors[:base] << I18n.t("user.group_invitations.create.this_user_is_already_invited")
end
end
end
def find_or_create_membership
user_membership = User::Membership.where(:group_id => self.group_id, :user_id => self.invitee_id).first_or_create(:status => "invited")
user_membership.update_column(:status, "invited") unless user_membership.new_record?
self.user_membership_id = user_membership.id
end
end
Тестирование этот код, я постоянно получаю ошибку «Этот пользователь уже приглашен,» даже если пользователь не был ранее приглашен. Я предполагаю, что это происходит потому, что работает find_or_create_membership
, тем самым установив status
в invited
. Любые идеи о том, что происходит или как разрешить ситуацию?
Есть ли способ запустить его после? Я попытался изменить 'after_create' на' after_validation', но я получил то же поведение. – nullnullnull
Я не понимаю ваш код четко, но чтобы отменить порядок ваших обратных вызовов, вы можете вызвать 'user_can_be_invited' в обратном вызове' after_create' или 'after_save'. Работая вокруг него, я отправил заказ обратных вызовов. – Zippie
Вы видите этот pdf-файл? https://www.edx.org/static/content-berkeley-cs169.2x~2013_Spring/handouts/slides/169.2x-Wk1-LS1.pdf Заказ со страницы 2 этого pdf. – Zippie