La ragione di sicurezza di base per l'esistenza di entrambi i parametri forti e attr_accessible è che ci sono alcuni attributi nel modello che non dovrebbe essere permettono di essere cambiato a meno che non sia l'intenzione esplicita di codice.
La leggera differenza tra di loro è la forma prospettica che fanno il loro lavoro.
StrongParameters focus sul caso d'uso: l'azione di ciascun controller può essere regolata per consentire o impedire determinati parametri, tenendo in considerazione qualsiasi condizione. Totale flessibilità
attr_accessible prende una prospettiva diversa. Invece di concentrarsi sul caso d'uso, si concentra sui ruoli. Ad esempio, a seconda del ruolo dell'utente determinati attributi possono essere modificati o meno.
Il modo di usare StrongParameters è quello di applicare le require
e permit
le parole chiave sulla hash param.
require
afferma che una chiave deve essere presente sull'hash params. require
solleverà un'eccezione se non c'è una tale chiave.
permit
indica che un campo è consentito. Qualsiasi chiave non consentita verrà rimossa dall'hash e quindi non verrà passata al modello mediante l'assegnazione di massa.
Modello
class League
attr_protected :final_price # Nobody can mass-assign the final price
attr_accessible :winner_name, :as => :jury
end
E il controller
class LeaguesController < ApplicationController
Queste due azioni utilizzano StrongParameters
# A common user can create a league
def create
league = League.new(league_params)
league.final_price = 1000
league.save
redirect_to(league)
end
# But only the admin can publish a league
def publish_league
league = League.find(params[:id]
league.update_attributes(league_params_as_admin)
end
questo usa attr_accessible
def publish_the_winner
league = League.find(params[:id]
# We would expect the current_user.role to return :jury.
league.assign_attributes(params[:league], :as => current_user.role)
end
private
def league_params
params.require(:league).permit(:name)
end
def league_params_as_admin
params.require(:league).permit(:name, :status)
end
end
Nella mia esperienza:
utilizzare la flessibilità dei parametri di forza per mettere a punto ciò che gli attributi possono essere di massa assegnato a ciascuno dei vostri controller.
Utilizzare l'onnipresenza di attr_accesible per assicurarsi che determinati attributi non possano essere assegnati in serie, a prescindere da cosa. Ad esempio, in un'attività Resque è possibile passare l'input dell'utente come parametro. Verificheresti che alcuni attributi non sono assegnati in serie usando attr_accesible.
Maggiori informazioni:
http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html
https://github.com/rails/strong_parameters
Puoi pubblicare il tuo Gemfile? Anche il codice nel tuo modello? – Agis
@randombits hai aggiornato il tuo progetto da rails3? – AKovtunov