Domanda

Nel mio negozio on-line, gli utenti sono autorizzati a modificare alcune proprietà dei loro ordini (ad esempio, il loro indirizzo di fatturazione), ma non in altri (ad esempio, l'indirizzo IP origine). Gli amministratori, d'altra parte, sono autorizzati a modificare le tutti proprietà di ordine.

Dato, questo, come posso usare :attr_accessible di rendere sicure mio modello Ordine? Oppure dovrò usarlo per marcare accessibili tutti gli attributi che gli amministratori possono modificare e astenersi dall'utilizzare Order.update_attributes(params[:order]) in quelle azioni di controllo che gli utenti normali possono accedere?

È stato utile?

Soluzione

In generale, attr_accessible non è lo strumento che stai cercando e Rails non viene fornito con tutto ciò costruito in che fa ciò che si vuole.

Se si vuole un controllo dettagliato su chi può aggiornare attributi specifici in un modello, si potrebbe fare qualcosa di simile:

class Order < ActiveRecord::Base
  def update_attributes_as_user(values, user)
    values.each do |attribute, value|
      # Update the attribute if the user is allowed to
      @order.send("#{attribute}=", value) if user.can_modify?(attribute)
    end
    save
  end
end

Poi si può cambiare la vostra Order.update_attributes(params[:order]) per Order.update_attributes_as_user(params[:order], current_user) e supponendo che si implementa il metodo User#can_modify? per restituire vero nei casi corretti, dovrebbe funzionare.

Altri suggerimenti

Ho avuto lo stesso problema e ora sto usando questo gioiello http://github.com/dmitry/ attr_accessible_block

E 'facile e utilizzato in alcuni siti di produzione.

Sì, dovrete modificare le azioni, quindi le autorizzazioni vengono controllati all'interno delle azioni. Chiamando Order#update_attributes non funziona per l'utente generale.

Non riesco a rember un plugin di autorizzazione basata sui ruoli che permetterebbe qualcosa che si sta cercando. Questo è perché questi plugin MixIn ai controller e non i modelli. Avrebbero anche bisogno di mixin in ActiveRecord::Base per verificare attr_accesible etc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top