W Railsach jaka jest różnica między attr_accessor
i attr_accessible
? Z mojego rozumienia, przy użyciu attr_accessor
używa się do tworzenia metod pobierających i ustawiających dla tej zmiennej, abyśmy mogli uzyskać dostęp do zmiennej jak Object.variable
lub Object.variable = some_value
.
Przeczytałem, attr_accessible
że ta konkretna zmienna jest dostępna dla świata zewnętrznego. Czy ktoś może mi powiedzieć, jaka jest różnica
ruby-on-rails
ruby
Felix
źródło
źródło
attr_accessor
jest używany do generowania metod pobierających i ustawiających. Zapoznaj się z moją odpowiedzią na poprzednie pytanie, aby uzyskać dość wyczerpujące wyjaśnienieattr_accessible
: stackoverflow.com/questions/2652907/…, a następnie zaktualizuj swoje pytanie, jeśli potrzebujesz później innych szczegółowych informacji.Odpowiedzi:
attr_accessor
jest metodą Ruby, która tworzy gettera i setera.attr_accessible
jest metodą Railsową, która pozwala przekazać wartości do przypisania masy:new(attrs)
lubupdate_attributes(attrs)
.Oto zadanie masowe:
Można sobie wyobrazić, że zamówienie może zawierać kod rabatowy, powiedzmy
:price_off
. Jeśli nie oznaczysz tagiem,:price_off
ponieważattr_accessible
powstrzymujesz złośliwy kod przed zrobieniem tego:Nawet jeśli twój formularz nie ma pola
:price_off
, jeśli jest w twoim modelu, jest domyślnie dostępny. Oznacza to, że spreparowany test POST mógłby go nadal ustawić. Użycieattr_accessible
białej listy zawiera te rzeczy, które można przypisać masowo.źródło
attr_accessible
w dokumentacji Railsów? api.rubyonrails.orgattr_accessible
edgeguides.rubyonrails.org/…Wiele osób w tym wątku i w Google bardzo dobrze wyjaśnia, które
attr_accessible
określa białą listę atrybutów, które mogą być aktualizowane zbiorczo ( wszystkie atrybuty modelu obiektowego jednocześnie ). Ma to głównie (i tylko) na celu ochronę twojej aplikacji z exploitu pirackiego „Mass Assignment”.Jest to wyjaśnione tutaj w oficjalnym dokumencie Rails: Mass Assignment
attr_accessor
to ruby kod do (szybkiego) tworzenia metod ustawiających i pobierających w klasie. To wszystko.Wyjaśnieniem jest to, że kiedy w jakiś sposób tworzysz połączenie między modelem (Rails) z tabelą bazy danych, NIGDY, NIGDY, NIGDY nie potrzebujesz
attr_accessor
w swoim modelu, aby tworzyć setery i gettery, aby móc modyfikować swój rekordy tabeli.Wynika to z faktu, że Twój model dziedziczy wszystkie metody z
ActiveRecord::Base
klasy, która już definiuje podstawowe akcesoria CRUD (tworzenie, czytanie, aktualizacja, usuwanie). Jest to wyjaśnione w oficjalnym dokumencie tutaj Rails Model i tutaj Nadpisywanie domyślnego akcesorium (przewiń w dół do rozdziału „Nadpisz domyślnego akcesorium”)Powiedz na przykład, że: mamy tabelę bazy danych o nazwie „użytkownicy”, która zawiera trzy kolumny „imię”, „nazwisko” i „rola”:
Instrukcje SQL:
Zakładałem, że ustawiłeś opcję
config.active_record.whitelist_attributes = true
w config / environment / production.rb, aby chronić swoją aplikację przed exploitem Mass Assignment. Wyjaśniono to tutaj: Przydział masowyTwój model Rails będzie idealnie współpracował z poniższym modelem:
Musisz jednak zaktualizować każdy atrybut użytkownika osobno w kontrolerze, aby widok formularza działał:
Teraz, aby ułatwić ci życie, nie chcesz tworzyć skomplikowanego kontrolera dla swojego modelu użytkownika. Więc zastosujesz
attr_accessible
specjalną metodę w swoim modelu klasy:Możesz więc użyć „autostrady” (przypisanie masowe) do aktualizacji:
Nie dodałeś atrybutów „rola” do
attr_accessible
listy, ponieważ nie pozwalasz użytkownikom na samodzielne ustawianie swojej roli (np. Admin). Robisz to sam na innym specjalnym widoku administratora.Chociaż twój widok użytkownika nie pokazuje pola „rola”, pirat może z łatwością wysłać żądanie HTTP POST zawierające „rolę” w haszowaniu parametrów. Brak atrybutu „rola”
attr_accessible
służy do ochrony aplikacji przed tym.Nadal możesz samodzielnie modyfikować atrybut user.role, jak poniżej, ale nie wszystkie atrybuty razem.
Dlaczego, do diabła, miałbyś skorzystać
attr_accessor
?Tak byłoby w przypadku, gdy formularz użytkownika pokazuje pole, które nie istnieje w tabeli użytkowników jako kolumna.
Załóżmy na przykład, że Twój widok użytkownika pokazuje pole „proszę powiedzieć administratorowi, że jestem tutaj”. Nie chcesz przechowywać tych informacji w swoim stole. Chcesz, aby Railsy wysłały Ci wiadomość e-mail z ostrzeżeniem, że jeden „szalony” ;-) użytkownik zasubskrybował.
Aby móc skorzystać z tych informacji, musisz je gdzieś tymczasowo przechowywać. Czy jest coś łatwiejszego niż odzyskanie go w
user.peekaboo
atrybucie?Więc dodajesz to pole do swojego modelu:
Dzięki temu będziesz mógł w przemyślany sposób wykorzystać ten
user.peekaboo
atrybut gdzieś w kontrolerze, aby wysłać wiadomość e-mail lub zrobić co chcesz.ActiveRecord nie zapisze atrybutu „peekaboo” w twojej tabeli, kiedy to zrobisz,
user.save
ponieważ nie widzi żadnej kolumny pasującej do tej nazwy w swoim modelu.źródło
attr_accessor
jest metodą Ruby, która daje metody ustawiające i pobierające do zmiennej instancji o tej samej nazwie. Jest to więc równoważne zattr_accessible
jest metodą Railsową, która określa, jakie zmienne można ustawić w przypisaniu masy.Po przesłaniu formularza masz coś takiego
MyModel.new params[:my_model]
, chcesz mieć trochę więcej kontroli, aby ludzie nie mogli przesyłać rzeczy, których nie chcesz.Możesz to zrobić
attr_accessible :email
, gdy ktoś zaktualizuje swoje konto, może zmienić swój adres e-mail. Ale nie zrobiłbyś tego,attr_accessible :email, :salary
ponieważ wtedy osoba mogłaby ustalić swoje wynagrodzenie poprzez złożenie formularza. Innymi słowy, mogliby włamać się do podwyżki.Tego rodzaju informacje wymagają jawnego przetwarzania. Samo usunięcie go z formularza nie wystarczy. Ktoś może wejść z firebugiem i dodać element do formularza, aby przesłać pole wynagrodzenia. Mogą użyć wbudowanego curl, aby przesłać nową pensję do metody aktualizacji kontrolera, mogą stworzyć skrypt, który przesyła post z tymi informacjami.
Podobnie
attr_accessor
jest z tworzeniem metod przechowywania zmiennych, a takżeattr_accessible
z bezpieczeństwem przypisań masowych.źródło
attr_accesible
:as
!class User < ActiveRecord::Base
attr_accessor
jest kodem ruby i jest używany, gdy nie masz kolumny w bazie danych, ale nadal chcesz pokazać pole w swoich formularzach. Jedynym sposobem na to jest toattr_accessor :fieldname
i możesz użyć tego pola w widoku lub modelu, jeśli chcesz, ale głównie w widoku.Rozważmy następujący przykład
Tutaj użyliśmy
attr_reader
( atrybut czytelny ) iattr_writer
( atrybut zapisywalny ) w celu uzyskania dostępu do celu. Ale możemy osiągnąć tę samą funkcjonalność za pomocąattr_accessor
. W skrócie, attr_accessor zapewnia dostęp zarówno do metod pobierających, jak i ustawiających.Tak zmodyfikowany kod jest jak poniżej
attr_accessible
pozwala wyświetlić listę wszystkich kolumn, które chcesz zezwolić na Przypisanie masowe. Przeciwnie do tego,attr_protected
co oznacza, że to pole NIE chcę, aby ktokolwiek miał pozwolenie na Mass Assign. Jest bardziej niż prawdopodobne, że będzie to pole w Twojej bazie danych, z którym nie chcesz, aby ktokolwiek małpował. Jak pole statusu lub tym podobne.źródło
W dwóch słowach:
attr_accessor
jestgetter
,setter
metody. mając na uwadzeattr_accessible
, że konkretny atrybut jest dostępny lub nie. Otóż to.Chciałbym dodać, że powinniśmy użyć parametru Strong zamiast
attr_accessible
chronić przed przypisaniem masy.Twoje zdrowie!
źródło
Szybki i zwięzły przegląd różnic:
źródło