2015-06-11 17 views
7

właśnie robi trochę czytanie na attr_accessor, attr_accessible i mocnych parametrów w kilku różnych miejscach:Różnica między attr_accessible i mocnych parametrów

Difference between attr_accessor and attr_accessible
How is attr_accessible used in Rails 4? http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html

i szukam w przypisanie masy:

http://code.tutsplus.com/tutorials/mass-assignment-rails-and-you--net-31695

Nie mogę zrozumieć różnicy między attr_accessible a silnymi parametrami. Nie jestem w 100% pewny, czy rozumiem wspomniane wyżej tematy, więc mógłbym przegapić coś prostego, ale wiem, że wykonują podobną pracę.

Jaka jest jednak różnica między attr_accessible a silnymi parametrami? Czy to po prostu inna nazwa tego samego? Dlaczego przeszliśmy od jednego do drugiego?

Wszelkie informacje są mile widziane.

Odpowiedz

14

attr_accessible został przestarzały w Rails 4 na rzecz Strong Parameters.

Oba podejścia mają różne podejścia do problemu przydziału masy, ale silniejsze parametry są bardziej elastyczne.

Na przykład masz model User o atrybutach email:string i is_admin:boolean. Chcesz zezwolić użytkownikom na modyfikowanie wiadomości e-mail za pośrednictwem formularza, ale nie na polu is_admin.

W Rails 3 należy zrobić:

attr_accesible :email 

Z takim podejściem nie jest możliwe dla użytkownika, aby zmodyfikować is_admin dlatego, że atrybut jest chroniony.

Jedną z dobrych rzeczy mocnych parametrów, które można wykonać następujące czynności w kontrolerze:

def user_params 
    if current_user.admin? 
    params.require(:user).permit(:email, :is_admin) 
    else 
    params.require(:user).permit(:email) 
    end 
end 

ten sposób jeden użytkownik administrator będzie mógł modyfikować is_admin podczas gdy zwykły użytkownik nie będzie.

To tylko jeden przykład, a nie najlepszy sposób udzielania użytkownikowi uprawnień administracyjnych, ale jest to dość przykładowe.

Główną zaletą silnych parametrów jest to, że są one zdefiniowane w kontrolerze i mogą być dynamicznie przydzielane w czasie wykonywania. attr_accessible był bardziej statycznym i monolitycznym sposobem na umieszczanie białych atrybutów.

Z drugiej strony attr_accessor to zupełnie inna sprawa i nadal może być użyty w Railsach 4, na przykład, jeśli potrzebujesz jednego atrybutu w swoim modelu, że nie jest konieczne utrzymywanie się lub zapisywanie w bazie danych, ale wymaga tego w formie. Pomyśl o tym:

attr_accessor :has_accepted_legal_terms

Jest to metoda Ruby, które mogą być używane do deklarowania atrybut modelu, który nie jest związany z bazą danych, atrybut klasy lub PORO (zwykły stary obiekt rubinowy).

5

Mocne parametry i attr_accessible to dwa różne sposoby dodawania zabezpieczeń do funkcji "przypisanie masy" w Railsach. Strong Parameters to metoda zalecana przez aktualną wersję Rails.

"Przypisanie masy" jest wygodnym skrótem w Railsach, który pozwala ustawić wiele właściwości modelu w pojedynczej instrukcji.

Na przykład wyobraź sobie, że masz @user, którą chcesz zaktualizować danymi z przesłania formularza. Bez przydziału masy musiałbyś napisać żmudny kod:

@user.first_name = params[:user][:first_name] 
@user.last_name = params[:user][:last_name] 
@user.phone_number = params[:user][:phone_number] 
... 
@user.save 

I dalej i dla każdego pola formularza.

masą zadania, cały ten kod staje się linia pojedyncza:

@user.update(params[:user]) 

Ale to jest pełna dziur bezpieczeństwa. Ponieważ params zawiera wszystkie dane przesłane przez przeglądarkę, złośliwy użytkownik może dodać dane do tego zgłoszenia, czego się nie spodziewałeś. Na przykład mogą dodać is_admin=1 do parametrów. Jeśli masz kolumnę bazy danych is_admin, to przypisanie masy po prostu pozwala użytkownikowi dokonać aktualizacji do administratora. Yikes!

To tutaj pojawiają się silne parametry. Przy silnych parametrach, Railsy podniosą ActiveModel::ForbiddenAttributesError, jeśli spróbujesz zrobić naiwną update(params[:user]). Zamiast tego musisz jasno określić parametry, jakich oczekujesz od przesłania przeglądarki, korzystając z pomocników, które zapewnia Strong Parameters. W ten sposób:

def user_params 
    # Note that :is_admin is not permitted! 
    params.require(:user).permit(:first_name, :last_name, :phone_number) 
end 

... 
@user.update(user_params) 

Nie mogę mówić za opiekunów Railsów, ale lubię Silne parametry, ponieważ jest elastyczny. Jeśli mam wiele akcji w kontrolerze użytkowników, które oczekują różnych parametrów, mogę łatwo opisać, używając parametrów, które powinny być dozwolone.

Jeśli mam różne role użytkowników, które mogą aktualizować różne atrybuty, mogę z łatwością modelować te uprawnienia. Jak wspomniano o @ CV-Gate, możesz nawet zmienić te uprawnienia w czasie wykonywania, co jest potężne.

Krótko mówiąc, elastyczność silnych parametrów wynika z faktu, że możesz zdefiniować tę metodę w dowolnym miejscu i jakkolwiek chcesz. Masz pełną moc koncepcji Ruby i OO, aby działało tak, jak chcesz.

Co z numerem attr_accessible?

Nie wdając się w zbyt wiele szczegółów (ponieważ ta funkcja nie jest już obsługiwana przez Rails): zamiast przy użyciu metody permit, byś zrobił coś podobnego za pomocą attr_accessible makro w samym modelu, podobnie jak to:

class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :phone_number 
    ... 
end 

Tak więc dla prostych przypadków działa bardzo podobnie do Silnych parametrów; po prostu definiujesz listę atrybutów w innym miejscu.

Jednakże, ponieważ attr_accessible jest silnie sprzężony z definicją klasy modelu, tracisz dużą elastyczność.Co jeśli masz dwa różne działania kontrolera, które muszą wykonać przypisanie masy dla tego samego modelu User? Teraz utknąłeś.

attr_accessor

attr_accessor makro jest wbudowany w Ruby i nie ma nic wspólnego z Rails, masowe cesją lub bezpieczeństwa. Po prostu ma podobną nazwę. :)

Powiązane problemy