2013-03-12 3 views
1

Насколько я могу судить, 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. Любые идеи о том, что происходит или как разрешить ситуацию?

ответ

7

find_or_create_membership работает первый

Порядок действий при создании:

before_validation 
after_validation 
before_save 
around_save 
before_create 
after_create 
after_save 
+0

Есть ли способ запустить его после? Я попытался изменить 'after_create' на' after_validation', но я получил то же поведение. – nullnullnull

+0

Я не понимаю ваш код четко, но чтобы отменить порядок ваших обратных вызовов, вы можете вызвать 'user_can_be_invited' в обратном вызове' after_create' или 'after_save'. Работая вокруг него, я отправил заказ обратных вызовов. – Zippie

+0

Вы видите этот pdf-файл? https://www.edx.org/static/content-berkeley-cs169.2x~2013_Spring/handouts/slides/169.2x-Wk1-LS1.pdf Заказ со страницы 2 этого pdf. – Zippie

1

Проблема на самом деле вытекает из моего контроллера:

invitation = User::GroupInvitation.create(params[:user_group_invitation]) 
if invitation.valid? 
    . . . . 
else 
    . . . . 
end 

Это вызвало метод проверки, чтобы получить вызов второй раз в течение invitation.valid?, и, конечно же, он отправил сообщение об ошибке, а затем, как status, имел alrea были установлены. Устранить проблему было легко. Я просто добавил состояние :on => :create:

validate :user_can_be_invited, :on => :create 
Смежные вопросы