11

Dopo aver letto il numero attr_accessible in the Rails 3.1 API, vedo che esiste un'opzione come :admin. Mi piacerebbe sapere due cose.Utilizzo di Rails 3.1: come =>: admin per l'aggiornamento degli attributi protetti da attr_accessible

  1. Se l'utente ha un flag di amministrazione, come fa il mio controller a dire al mio modello che l'utente è un amministratore.

  2. Se l'utente è un proprietario, posso specificare :as => owner nel mio modello e ancora una volta come il mio controllore informa il mio modello che sono il proprietario di un articolo.

risposta

18

Non esiste un'integrazione integrata con i modelli; si passa nel ruolo nella chiamata assign_attributes:

@project.assign_attributes(params[:project], :as => :admin) 

I :as default dei parametri per :default, e si può passare in qualsiasi simbolo che si desidera. Per integrare questo nel modello User, si potrebbe dare un attributo chiamato role, e poi fare qualcosa di simile:

@project.assign_attributes(params[:project], :as => current_user.role.to_sym) 

È anche possibile bypassare la protezione usando :without_protection:

@project.assign_attributes(params[:project], :without_protection => true) 

In modo analogo , I metodi new, , create!, update_attributes e update_attributes! rispettano tutti la sicurezza di assegnazione di massa. Il Ruby on Rails guide on security ha more info.

+0

Ho una domanda però.Sto aggiornando un Rails 4 fino a 5 (che era precedentemente su Rails 3. e mi sono imbattuto in qualcosa come '@ project.update_attributes (params [: project],: as => current_user.role.to_sym)' ma ma io ricevi un errore che dice "update_attributes" accetta solo un argomento. Cosa è successo alla parte "come:: admin" di questo codice? È sicuro rimuoverlo completamente? – Emanuel

3

Per entrambi gli scenari, lo passeresti nello stesso modo in cui lo dichiari in origine. Così, per esempio:

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :credit_card, :as => :admin 
end 

Se avete fatto

user = User.new(:name => "John", :credit_card => "1234123412341234") 

allora non essere in grado di assegnare il credit_card:

user.attributes # {:name => "John", :credit_card => nil} 

Tuttavia, se dichiarate che sarà :as => :admin quindi lo consente

user = User.new({:name => "John", :credit_card => "1234123412341234"}, :as => :admin) 
user.attributes # {:name => "John", :credit_card => "1234123412341234"} 
.210

Maggiori informazioni:

http://www.enlightsolutions.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1

1

tutti gli attributi che si desidera accedere come utente specifico dovrebbero essere definiti in modo corretto. Ad esempio:

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :credit_card, :as => :admin 
    end 

Questo ha mostrato un errore per me. Ma quando ho modied a

class User < ActiveRecord::Base 
    attr_accessible :name 
    attr_accessible :name, :credit_card, :as => :admin 
    end 

questo ha funzionato bene quando ho usato

@user.update_attributes(params[:user], :as => :admin) 
Problemi correlati