2015-06-11 16 views
7

Ho appena fatto un po 'di lettura su attr_accessor, attr_accessible e forti parametri a pochi luoghi diversi:Differenza tra attr_accessible ei parametri forti

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

E io sto guardando assegnazione di massa:

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

Non riesco a capire la differenza tra attr_accessible e parametri forti. Non sono sicuro al 100% della mia comprensione dei temi sopra menzionati, quindi potrei mancare qualcosa di semplice, ma so che svolgono un lavoro simile.

Tuttavia, qual è la differenza tra attr_accessible e parametri forti? Sono solo un nome diverso per la stessa cosa? Perché ci siamo spostati da uno all'altro?

Qualsiasi informazione è apprezzata.

risposta

14

attr_accessible è stato deprecato in Rails 4 in favore di Strong Parameters.

Entrambi sono approcci diversi al problema dell'assegnazione di massa, ma Strong Parameters è più flessibile.

Ad esempio, si dispone di un modello User con gli attributi email:string e is_admin:boolean. Desiderate consentire agli utenti di modificare la loro e-mail attraverso un modulo ma non il campo is_admin.

in Rails 3 si dovrebbe fare:

attr_accesible :email 

Con questo approccio non è possibile per un utente di modificare is_admin perché questo attributo è protetto.

Una delle cose buone di parametri di forza è che si potrebbe effettuare le seguenti operazioni nel controller:

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

In questo modo un utente amministratore sarà in grado di modificare is_admin mentre un utente normale non lo farà.

Questo è solo un esempio e non il modo migliore per concedere autorizzazioni amministrative a un utente, ma è piuttosto illustrativo.

Il vantaggio principale di Strong Parameters è che sono definiti nel controller e possono essere assegnati dinamicamente in fase di esecuzione. attr_accessible era un modo più statico e monolitico per attribuire gli attributi alla whitelist.

D'altra parte, attr_accessor è una cosa completamente diversa e può ancora essere utilizzato in Rails 4, ad esempio, se nel proprio modello è necessario un attributo che non sia necessario persistere o essere scritto nel database ma lo si richiede in una forma Pensateci:

attr_accessor :has_accepted_legal_terms

E 'un metodo di Ruby che può essere utilizzato per dichiarare un attributo del modello che non è legato al database, un attributo di una classe o PORO (plain oggetto rubino vecchio).

5

I parametri forti e attr_accessible sono due modi diversi per aggiungere protezioni di sicurezza alla funzione "assegnazione di massa" Rails. Strong Parameters è il modo in cui è prescritto dalla versione corrente di Rails.

"Assegnazione di massa" è una comoda scorciatoia in Rails che consente di impostare molte proprietà di un modello in una singola istruzione.

Ad esempio, immagina di avere un @user che desideri aggiornare con i dati dell'invio di un modulo. Senza assegnazione di massa, che avrebbe dovuto scrivere codice noioso come questo:

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

E così via per ogni campo di modulo.

con assegnazione di massa, tutto questo codice diventa una sola riga:

@user.update(params[:user]) 

Ma, questo è pieno di buchi di sicurezza. Poiché params contiene qualsiasi dato inviato dal browser, un utente malintenzionato potrebbe aggiungere dati a tale invio che non ci si aspettava. Ad esempio, potrebbero aggiungere is_admin=1 ai parametri. Se si dispone di una colonna del database is_admin, l'assegnazione di massa consente all'utente di eseguire l'aggiornamento a un amministratore. Yikes!

Qui è dove entra in gioco Strong Parameters. Con Strong Parameters, Rails aumenterà un ActiveModel::ForbiddenAttributesError se si tenta di fare l'ingenuo update(params[:user]). Invece, è necessario essere espliciti sui parametri che ci si aspetta dall'invio del browser, utilizzando gli helper require e permit forniti da Strong Parameters. Come questo:

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) 

Non posso parlare per i manutentori di Rails, ma mi piace Parametri forte perché è flessibile. Se nel controller degli utenti sono presenti più azioni che prevedono parametri diversi, posso facilmente descrivere utilizzando permit i parametri che dovrebbero essere consentiti.

Oppure, se ho diversi ruoli utente che sono autorizzati ad aggiornare diversi attributi, posso facilmente modellare tali permessi. Come menzionato @ CV-Gate, è possibile anche modificare queste autorizzazioni in fase di runtime, che è un potente.

In breve, la flessibilità di Strong Parameters è dovuta al fatto che è possibile definire il metodo user_params ovunque e in qualsiasi modo. Hai tutta la potenza dei concetti di Ruby e OO per farlo funzionare nel modo desiderato.

Che dire di attr_accessible?

Senza entrare troppo nel dettaglio (in quanto questa funzione non è più supportata da Rails): invece di utilizzare il metodo di permit, si dovrebbe fare qualcosa di simile utilizzando un attr_accessible macro nel modello stesso, in questo modo:

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

Quindi, per casi semplici, funziona in modo molto simile a Strong Parameters; devi solo definire l'elenco degli attributi in un posto diverso.

Tuttavia, dal momento che attr_accessible è fortemente associato alla definizione della classe del modello, si perde molta flessibilità.Cosa succede se si hanno due diverse azioni del controllore che devono eseguire l'assegnazione di massa per lo stesso modello User? Ora sei bloccato.

attr_accessor

Il attr_accessor macro è integrato in Ruby e non ha nulla a che fare con Rails, l'assegnazione di massa, o la sicurezza. Capita semplicemente di avere un nome simile. :)

Problemi correlati