Mam model użytkownika, który ma atrybut: credits. Chcę prosty przycisk, który będzie dodać 5 kredytów użytkownika, za pośrednictwem szlaku zwanym „dodać” tak, że/users/3/add by dodać 5 do kredytów identyfikatora użytkownika = 3.Szyny: Zaktualizuj atrybut modelu bez wywoływania wywołań zwrotnych
def add
@user = User.find(params[:id])
@user.credits += 5
redirect_to root_path
end
To odpowiednią część mojego kontrolera. Problem polega na tym, że nie chcę wywoływać @ user.save, ponieważ mam wywołanie zwrotne before_save, które ponownie szyfruje hasło użytkownika na podstawie bieżącego czasu UTC. Chcę po prostu dodać 5 do atrybutu i uniknąć wywołania zwrotnego, nigdy nie sądziłem, że tak prosta rzecz może być tak trudna.
EDIT:
Zmieniłem oddzwanianie do: before_create, tu jest mój nowy kod kontrolera (odpowiedniej części):
def add
@user = User.find(params[:id])
@user.add_credits(5)
@user.save
flash[:success] = "Credits added!"
redirect_to root_path
end
i tu jest mój kod w modelu:
def add_credits(num)
self.credits = num
end
EDYCJA 2:
OK problem z potwierdzeniem które sprawiło, że zmiany w "EDYCIE" nie działają, ale nadal chciałbym odpowiedzi na oryginalne pytanie o aktualizację bez wywołań zwrotnych!
Dostarczyłem łącze z listą metod, które nie wyzwalają wywołań zwrotnych, a zarówno Finbarr jak i ja zasugerowaliśmy użycie warunkowego wywołania zwrotnego - jakich dodatkowych rozwiązań szukasz? –