Uczę się Railsów z railstutorial.org i coś mnie pogubiło: w tym rozdziale autor mówi nam, abyśmy wykonali testy w konsoli respond_to?
metodą na obiekcie User i wszystko działa dobrze. Ale później, kiedy piszemy test dla :encrypted_password
atrybutu, używa respond_to
.
Z ciekawości wypróbowałem respond_to
w konsoli obiekt User i otrzymałem komunikat o błędzie informujący, że metoda nie istnieje. Niestety, jeśli spróbuję napisać test używając respond_to?
zamiast respond_to
, test nie działa.
Czy ktoś mógłby mi wyjaśnić różnicę i dlaczego test działa tylko z respond_to
?
źródło
?
znak na końcu nazwy metody w ruby nie gwarantuje, że metoda zwróci wartość logiczną. To?
tylko część nazwy metody, jak każdy inny znak. To, że metody ze znakami zapytania powinny zwracać wartość logiczną, jest ugruntowaną konwencją, ale nie jest powszechnie przestrzegana. (patrz na przykład github.com/rails/rails/pull/5329 i zamieszanie spowodowane, gdy metoda ze znakiem zapytania nie zwróciła wartości bool)respond_to?
jest wartością logiczną.respond_to
Jest stosowany (zwykle) do określania informacji na wyświetlaczu. Więcej informacji tutaj . Dorespond_to?
sprawdza, czy metoda istnieje i zwraca true jeśli to robi i false jeśli nie.źródło
Test korzysta z wygodnych pomocników, aby był bardziej przyjazny dla użytkownika.
Ruby to Ruby, więc użycie starego dobrego
respond_to?
byłoby działało, gdybyś nazwał to w ten sposób:@user.respond_to?(:encrypted_password).should be_true
Jest inny
respond_to
używany w kontrolerach, ale nadal nie ma to nic wspólnego z tymi, których już spotkałeś.źródło