2012-08-04 17 views

Odpowiedz

58

Wszystko to powinno działać:

user[attribute_name] 
user.read_attribute(attribute_name) 
user.send(attribute_name) 

Osobiście nie użyłby send w tym przypadku. Jeśli jest dostępny, wolisz public_send przesłać

+0

zgadzam się, że lepiej jest unikać 'send'. Jeśli jednak uzyskujesz dostęp do powiązania, a nie do zwykłego atrybutu, wydaje się, że najlepiej jest "send". – lime

+0

Czy możesz mi powiedzieć, dlaczego powinienem unikać "wysyłania"? Obawiam się, że muszę go użyć. – jmarceli

+1

@ user2041318 z wysyłką musisz być pewny, że została ci podana faktyczna nazwa atrybutu (zamiast na przykład "zniszczyć") –

1

Możesz użyć albo [] lub read_attribute(), ale they are not equivalent. Bezpieczniejszą metodą dostępu jest użycie metody [] method, ponieważ spowoduje ona zgłoszenie błędu ActiveModel::MissingAttributeError, jeśli atrybut nie istnieje. Jeśli atrybut nie istnieje, zwraca read_attribute method.

+1

Metoda [read_attribute jest nadal obecna w ActiveRecord 5] (http://api.rubyonrails.org/classes /ActiveRecord/AttributeMethods/Read.html#method-i-read_attribute) i nie mogę znaleźć żadnych wskazówek na temat tego, że jest przestarzałe. – rkallensee

+0

Przeczytaj [tę stronę APIdock] (http://apidock.com/rails/ActiveRecord/AttributeMethods/read_attribute), która stwierdza, że: _ "Ta metoda jest nieaktualna lub przeniesiona na najnowszą stabilną wersję. Ostatnia istniejąca wersja (v2. 3.8) jest pokazany tutaj. "_ –

+3

Został właśnie przeniesiony do modułu" ActiveRecord :: AttributeMethods :: Read "i jest nadal obecny. – rkallensee

0

W Rails 5, tylko attribute_name = "name" działa

Powiązane problemy