Wie "sperren" Sie einen Datensatz vor dem Aktualisieren oder Löschen?

  • Ich habe ein Modell User, das automatisch eine Task generiert.

    Ich möchte, dass diese Aufgabe nicht bearbeitet oder gelöscht wird.

    Welche Art von Änderungen an meinem Controller muss ich vornehmen? Gibt es eine elegante Lösung, oder muss ich jedes Mal überprüfen, ob es eine Aufgabe zum Bearbeiten / Zerstören gibt?

    25 August 2011
    ZMorek
2 answers
  • Sie können eine Validierung verwenden, um dies ganz gut auszuführen.

     class Thing < ActiveRecord::Base
      validate :locked_cannot_be_modified
    
      private
    
      def locked_cannot_be_modified
        errors.add(:base, "Entry is locked") if changes.any? && whatever_logic_makes_it_locked
      end
    end
     

    Alternativ können Sie das auch tun Readonly implementieren? beim Modell:

     class Thing < ActiveRecord::Base
      def readonly?
        whatever_logic_makes_it_locked || super
      end
    end
     

    Dieser Ansatz löst eine Ausnahme aus, anstatt einen Validierungsfehler. Ich denke, es hängt davon ab, was Sie versuchen zu tun, um herauszufinden, welcher Ansatz besser ist.

    01 February 2012
    Will Tomlins
  • Soweit mir bekannt ist, gibt es keine elegante Lösung. Sie müssten jedes Mal im Controller nachsehen. Dies ist jedoch einfach, wenn Sie diese Methode in Ihrem Controller definieren:

     def find_task
      @task = Task.find(params[:id])
      if @task.locked?
        flash[:error] = "This task is locked and cannot be altered at this stage."
        redirect_to tasks_path and return
      end
    end
     

    Dann können Sie diese Methode als before_filter für die Aktionen aufrufen, die Sie interessieren. Wenn Sie nil zurückgeben (das ist es, was return tut), wird before_filter angehalten und die Aktion wird nicht ausgeführt.

    25 August 2011
    Ryan Bigg