Frage

In meinem Online-Shop, werden die Benutzer erlaubt, bestimmte Eigenschaften ihrer Aufträge ändern (zum Beispiel ihrer Rechnungsadresse), andere aber nicht (zum Beispiel der Entstehung IP-Adresse). Administratoren, auf der anderen Seite, ist erlaubt zu ändern alle , um Eigenschaften.

In Anbetracht diesen, wie kann ich :attr_accessible richtig mein Auftragsmodell sichern? Oder muss ich es verwenden, um zugänglich zu markieren Sie alle Attribute, die Administratoren ändern können und verzichten auf Order.update_attributes(params[:order]) in den Controller-Aktionen, dass normale Benutzer zugreifen kann?

War es hilfreich?

Lösung

Im Allgemeinen attr_accessible ist nicht das Werkzeug für Sie suchen und Rails kommt nicht mit irgendetwas, dass gebaut tut, was Sie wollen.

Wenn Sie eine fein abgestimmte Kontrolle über wollen, die bestimmte Attribute in einem Modell aktualisieren, können Sie so etwas wie tun könnte:

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

Dann können Sie Ihre Order.update_attributes(params[:order]) ändern Order.update_attributes_as_user(params[:order], current_user) und vorausgesetzt, Sie die User#can_modify? Methode implementieren wahr in den richtigen Fällen zurückzukehren, sollte es funktionieren.

Andere Tipps

Ich hatte das gleiche Problem und jetzt verwende ich dieses Juwel http://github.com/dmitry/ attr_accessible_block

Es ist einfach, und in einiger Produktions Website verwendet.

Ja, werden Sie die Aktionen ändern müssen, so Berechtigungen innerhalb der Aktionen überprüft werden. Der Aufruf Order#update_attributes wird nicht für den allgemeinen Benutzer arbeiten.

Ich kann keine rollenbasierte Autorisierung Plugin rember, die für etwas, das Sie suchen erlauben würde. Dies liegt daran, diese Plugins zu den Controllern und nicht die Modelle mixin. Sie würden auch in ActiveRecord::Base mixin müssen für attr_accesible etc zu überprüfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top